我有一個有很多組的 df。
N = int(1E6)
df = pd.DataFrame({'A':np.random.randint(300_000, size=N),
'B': np.random.rand(N)})
df.loc[::2, ['B']] = np.nan
我想計算每個組的總和,因為該組至少有一個非 Nan 值。我遇到以下情況很慢:
df.groupby('A').agg(**{
'newname' : ('B', lambda x: x.sum(min_count=1))
})
(22 秒)
雖然以下是快速的:
df.groupby('A').sum(min_count=1)
(0.11 秒)。
但是我想使用命名聚合。
我在 named_aggregation 方法中做錯了什么,從而降低了性能?我也嘗試了 functools.partial(而不是 lambda 函式),但這產生了相同的性能。
uj5u.com熱心網友回復:
傳入后lambda,操作不再跨組矢量化,即使它可以在每個組內矢量化。例如:
df.groupby('A').agg(**{'newname' : ('B', 'sum')})與 相當df.groupby('A')['B'].sum()并且比 快得多lambda x: x.sum()。
也就是說,我在某處讀到,命名 agg 可能比直接應用內置函式慢一點。例如,這將比.agg:
d = df.groupby('A')
pd.DataFrame({'new_name': d['B'].sum(min_count=1),
'other_name': d['B'].size()
})
但是,您的代碼庫看起來不像.agg.
uj5u.com熱心網友回復:
第二種解決方案更快的一個原因可能是因為在內部,它使用Cython,它是 Python 轉換為 C 的,并且已知對于演算法要快得多。
GroupBy.sum() 呼叫 GroupBy._agg_general(),而后者又呼叫 GroupBy._cython_agg_general()...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/344014.html
下一篇:根據串列重命名列
