对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()和其他各种操作。
答案 0 :(得分:1)
要获得更好的性能,请使用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)
答案 1 :(得分:0)
我用apply
弄清楚了:
df_grouped = df.groupby('group')
df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
group
0 0.834666
1 1.096652
dtype: float64