Pandas迭代太慢,我该如何向量化这段代码?



我是一个小数据科学家,我正试图解决一个问题,可能是简单的经验丰富的程序员。我正在处理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上使用迭代太慢了。我一直在研究替代方案,我知道:

  1. 我可以使用apply
  2. 我可以通过Pandas Series(比apply更好)对它进行矢量化
  3. 我可以通过Numpy对它进行矢量化(比Pandas更好)
  4. 我可以使用Swifter -它使用apply方法,然后在Dask, Ray和矢量化之间决定更好的解决方案

但是我不知道如何将我的代码转换为这些解决方案。

谁能帮我演示我的代码的解决方案?一个就够了,但如果有人能给出不止一个的解决方案,那就真的很有教育意义了。

任何帮助我都将感激不尽!

您可以使用agg:

>>> df.agg({'id': str, 'vectors': lambda v: [str(i) for i in v], 
'processing_timestamp': str}).to_dict('records')
[{'id': '3498001704',
'vectors': ['0.4021441', '0.45425776', '0.3963987', '0.23765437'],
'processing_timestamp': '2021-10-26 23:48:57.315275'}]

基本上就是将所有内容转换为字符串然后将DataFrame转换为字典列表

对于第二部分,有一个pandas方法to_dict。对于第一部分,我将只使用astypeapply来转换类型

df["processing_timestamp"] = df["processing_timestamp"].astype(str)
df["embeddings_vector"] = df["vectors"].apply(lambda row: [str(x) for x in row])
result = df[["id", "embeddings_vector", "processing_timestamp"]].to_dict('records')

没有样本数据有点难测试,但希望这有助于;)此外,就像我对lambda函数所做的那样,你基本上可以将整个循环体包装在apply中,但这会创建太多的临时字典,从而影响速度。

您可以使用pandas.DataFrame方法将其转换为其他类型,如DataFrame.to_dict()等。

最新更新