熊猫分组如果条件:总和,否则:基于另一列的给定列的最大值

时间:2018-11-09 23:39:43

标签: python pandas

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()和其他各种操作。

2 个答案:

答案 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