我是一名 Jr. 資料科學家,我正在嘗試解決一個對有經驗的程式員來說可能很簡單的問題。我正在 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 和矢量化之間為您決定更好的解決方案
但我不知道如何為這些解決方案轉換我的代碼。
誰能幫我演示我的代碼的解決方案?一個就足夠了,但是如果有人可以展示不止一個解決方案,那對于這個問題真的很有教育意義。
任何幫助我將不勝感激!
uj5u.com熱心網友回復:
您可以使用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'}]
uj5u.com熱心網友回復:
因此,您基本上將所有內容都轉換為字串,然后將您的 DataFrame 轉換為 dict 串列
對于第二部分,有一個 pandas 方法to_dict。對于第一部分,我將使用astype并且apply僅轉換型別
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.
uj5u.com熱心網友回復:
您可以使用pandas.DataFrame方法將其轉換為其他型別,例如DataFrame.to_dict()和more。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338810.html
