![](/img/trans.png)
[英]pandas groupby; if condition: sum else: max for given column based on another column
[英]Pandas groupby and create max or sum based on critera of another column
我無法為我自己的用例協調幾個不同的帖子,但相信我已經接近了。
我有一個包含 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())
使用numpy.where
和groupby.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')])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.