簡體   English   中英

Pandas groupby 並根據另一列的標准創建最大值或總和

[英]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.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')])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM