我有一個像這樣的DataFrame。df = pd.DataFrame({'a': np.random.randint(0, 3, 10**7),
'b': np.random.randint(0, 4000, 10**7),
'c': np.random.random(10**7)}我想按前兩列分組(無序,與我在此處提供的組數大致相同),然后區分第三列。df.groupby(['a', 'b']).c.diff(periods=-1)可悲的是,這對我來說很慢,但我想這是相當多的工作。>>> %timeit df.groupby(['a', 'b']).c.diff(periods=-1)
10.2 s ± 75.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)有什么辦法可以避免 Pandas groupby 加快速度嗎?我知道在 Pandas 中進行 groupby->reduce 時,通??梢杂眉?NumPy 替換,但我不確定這里是否有什么聰明的方法可以代替 groupby 操作。
1 回答

胡子哥哥
TA貢獻1825條經驗 獲得超6個贊
這確實是一個有趣的問題,因為我們通常只選擇groupby()
,即使它相當昂貴。
這是另一種更快的方法:
排序方式
['a','b']
計算差異,屏蔽每個塊中的最后一行
NaN
和代碼:
s = df.sort_values(['a', 'b'])df['diff_c'] = (s['c'].diff(periods=-1) .where(s.duplicated(['a','b'], keep='last')) )
在我的計算機上,您的代碼在 8.5 秒內運行,而上述代碼在 1.8 秒內運行。
添加回答
舉報
0/150
提交
取消