[英]Multiple column groupby with pandas to find maximum value for each group
[英]Pandas find the maximum in each group that satisfy a condition
對不起,如果之前有人問過,找不到確切的問題。
我正在尋找Pandas中最有效的方法來執行以下操作:
可以說我們有下表:
ID SUB_ID COND
1 101 1 1
2 101 2 1
3 101 3 1
4 102 1 1
5 102 2 0
6 103 1 0
7 103 2 0
8 103 3 0
9 103 4 0
基本上,對於每個“ID”,我們希望得到最大的“SUB_ID”, 假設COND為1 。 理想情況下,我們希望將此值作為新列添加到該ID的每一行。 如果該ID的行沒有滿足條件,我們想添加0(而不是null)
結果數據框將是:
ID SUB_ID COND MAX_SUB_ID
1 101 1 1 3
2 101 2 1 3
3 101 3 1 3
4 102 1 1 1
5 102 2 0 1
6 103 1 0 0
7 103 2 0 0
8 103 3 0 0
9 103 4 0 0
我現在能想出的最佳方法是僅選擇COND = 1的行,然后在此數據幀上執行groupby以獲取最大子ID,然后將其連接回主數據幀。 在此之后,我可以將null更改回0。
df_true = df[df['COND']==1]
max_subid_true=df_true['SUB_ID'].groupby(df_true['ID']).max()
joined_df = df.merge(pd.DataFrame(max_subid_true),how='left',left_on='ID',right_index=True)
joined_df.loc[pd.isnull(joined_df['SUB_ID_y']),'SUB_ID_y']=0
有什么不同的想法嗎?
df.assign(MAX_SUB_ID=df.SUB_ID.mul(df.COND).groupby(df.ID).transform('max'))
ID SUB_ID COND MAX_SUB_ID
1 101 1 1 3
2 101 2 1 3
3 101 3 1 3
4 102 1 1 1
5 102 2 0 1
6 103 1 0 0
7 103 2 0 0
8 103 3 0 0
9 103 4 0 0
注意事項
SUB_ID
始終為正 COND
始終為1
或0
替代方案(減少警告)
但不那么有趣
df.assign(MAX_SUB_ID=df.ID.map(df.query('COND == 1').groupby('ID').SUB_ID.max()) \
.fillna(0).astype(int))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.