【发布时间】:2021-10-26 14:13:00
【问题描述】:
我是一名初级数据科学家,我正在尝试解决一个对于有经验的程序员来说可能很简单的问题。我正在处理 GCP 上的大数据,我需要优化我的代码。
[...]
def send_to_bq(self, df):
result = []
for i, row in df[["id", "vectors", "processing_timestamp"]].iterrows():
data_dict = {
"processing_timestamp": str(row["processing_timestamp"]),
"id": row["id"],
"embeddings_vector": [str(x) for x in row["vectors"]],
}
result.append(data_dict)
[...]
我们的 DataFrame 具有以下模式:
id name \
0 3498001704 roupa natal flanela animais estimacao traje ma...
vectors \
0 [0.4021441, 0.45425776, 0.3963987, 0.23765437,...
processing_timestamp
0 2021-10-26 23:48:57.315275
在 DataFrame 上使用 iterrows 太慢了。我一直在研究替代方案,我知道:
- 我可以使用申请
- 我可以通过 Pandas 系列对其进行矢量化(优于应用)
- 我可以通过 Numpy 对其进行向量化(比 Pandas 向量化更好)
- 我可以使用 Swifter - 它使用 apply 方法,然后在 Dask、Ray 和矢量化之间为您决定更好的解决方案
但我不知道如何为这些解决方案转换我的代码。
谁能帮我演示我的代码的解决方案?一个就足够了,但如果有人能展示不止一个解决方案,这对这件事来说真的很有教育意义。
任何帮助我都会感激不尽!
【问题讨论】:
-
请使用
print(df.head().to_string(index=False))的输出更新您的帖子作为可重复的示例 -
使用
df.to_dict(['processing_timestamp', 'id', 'embeddings_vector']) -
感谢您的修改。最佳实践是让我的代码在 Stack Overflow 上可重现,你是对的。我将打印头部并编辑我的问题。
-
我已经编辑了我的问题并合并了 DataFrame 中的头部。
标签: python pandas dataframe numpy swifter