我有一個熊貓數據框。我使用groupBy
(在1列)+ apply
組合向數據框添加新列。 apply通過參數調用一個自定義函數。完整的調用看起來是這樣的:熊貓dataframe groupby + apply +新列慢
df = df.groupby('id').apply(lambda x: customFunction(x,'searchString'))
自定義功能的工作原理如下:基於一個if
else
情況下,新列要麼充滿了1
或0
。然後該團隊返回。廣義一點,自定義函數如下:
def customFunction(group,searchString):
#print(group.iloc[[0]]['id'].values[0])
if len(group[(group['name'] == searchString)) > 0:
group['newColumn'] = 1
else:
group['newColumn'] = 0
return group
我的問題是,腳本運行比較長,即使我不真的多的數據處理。這些是我的數據的統計數據: 數據幀有3130行和49列。 groupBy生成1499個獨立的組。
如果我在customFunction
中輸出了一些調試文本,我觀察到通過每個組的實際迭代非常快,但在最後它需要幾秒(比迭代本身更長),直到groupBy
實際完成。我認爲這與重新索引或重新分配新列中的新數據有關。
我的問題,現在:
- 爲什麼
groupBy
+apply
需要這麼長時間?爲什麼實際迭代已經完成的部分需要很長時間? - 如何避免這個瓶頸?我如何改進我的代碼(見上文)以更快地執行?
- 更一般地說:如何將模式「按特定列分組然後添加基於條件的新列」可以最有效地實現?也許有一種方法是創建一個單獨的數據結構,而不需要返回組。然後,在一個單獨的步驟中,新計算的數據結構可以與原始數據框結合。但是,我不太確定這是否會更好。
我已閱讀,應避免回組,因爲它需要很長,但我覺得在我的情況下,它是必要的,因爲我明確我customFunction
生成新的數據,而這需要返回數據。
請將樣本數據 –
嘗試在應用函數之前對其進行聚合:'df.groupby('id')。sum()。apply(...)' –
需要很長的時間,因爲每行都會調用您的自定義函數。你想做什麼?應該可以使用更快的技術。 –