说df
我在group
:
df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
df['group'] = [0, 0, 1, 1]
然后我想折叠 df 以便在 B 的总和大于 1 时对 A 求和,如果 B 的总和小于或等于 1,我想要 A 的最大值。
然后我想要 B 的 min() 和对其余列的其他各种操作。
为了获得更好的性能,请使用where
:
np.random.seed(15)
N = 1000
df = pd.DataFrame(np.random.rand(N,10), columns=list('abcdefghij'))
df['group'] = np.random.randint(100, size=N)
df_grouped = df.groupby('group')
s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
print (s1)
df_grouped = df.groupby('group')
s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
print (s2)
In [69]: %%timeit
...: df_grouped = df.groupby('group')
...: s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
...:
24.8 ms ± 228 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [70]: %%timeit
...: df_grouped = df.groupby('group')
...: s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
...:
1.63 ms ± 58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句