熊猫groupby并基于另一列的critera创建最大值或总和

时间:2020-03-20 18:37:19

标签: python pandas pandas-groupby

我在为自己的用例协调几个不同的帖子时遇到困难,但相信我已经结束了。

我有一个3列的数据框;用户,标志,小时。

我想按用户对数据帧进行分组,并创建一个新的列,该列基于标志值求和或取小时行的最大值。每个用户都有两行。

所以看起来像这样:

User: 1 Flag: 0 Hours: 2
User: 1 Flag: 0 Hours: 3

User: 2 Flag: 1 Hours: 1
User: 2 Flag: 1 Hours: 3

User: 3 Flag: 2 Hours: 1
User: 3 Flag: 2 Hours: 2

我想创建一个名为“ Agg”的新列,该列要么对两行求和,要么根据标志取行的最大值。如果标志为0,则总和;如果标志为1,则最大值;如果标志为2,则最大值。即使结果相同,我也会分别调用标志1和标志2,因为稍后可能会更改逻辑。

结果就是这样:

User: 1 Flag: 0 Hours: 2 Agg: 5
User: 1 Flag: 0 Hours: 3 Agg: 5

User: 2 Flag: 1 Hours: 1 Agg: 3
User: 2 Flag: 1 Hours: 3 Agg: 3

User: 3 Flag: 2 Hours: 1 Agg: 2
User: 3 Flag: 2 Hours: 2 Agg: 2

这是我到目前为止的内容,但是我无法使其正常工作。原谅我的新手编码。

group = sample.groupby('User')
sample[:,'Agg'] =group.apply(lambda grp: grp['Hours'].max() if grp['Flag'] == 1 elif grp['Flag']==2 else grp['Hours'].sum())

1 个答案:

答案 0 :(得分:2)

使用numpy.wheregroupby.transform

groups = df.groupby('User')['Hours']
df['Agg'] = np.where(df['Flag'].astype(bool),
                     groups.transform('max'),
                     groups.transform('sum'))

如果还有更多情况,您可以使用np.select

np.select([df['Flag'].eq(0), df['Flag'].isin([1,2])],
          [groups.transform('sum'), groups.transform('max')])