[英]How to select pandas row with maximum value in one column, from a group of rows that share two common columns?
[英]Group Pandas dataframe by two columns and output the maximum column value indication to new column
我有一個 Pandas dataframe,我需要將其按兩個不同的列分組以檢查列中的哪個值最高。 但是,如果第一個選項中的值存在或已經是最高的,則無需檢查第二個子組。 我已經查看了使用 groupby 獲取組中具有最大值的行,但我必須進行一些額外的檢查,這是我無法做到的。
例子:
df = pd.DataFrame({
'First': ['KAT1', 'KAT1', 'KAT2', 'KAT3', 'KAT3', 'KAT4', 'KAT4', 'KAT4', 'KAT4'],
'Second': ['E', 'M', 'M', 'E', 'E', 'E', 'M', 'M', 'E'],
'Value': [20, 28, 25, 26, 24, 19, 23, 24, 25]
})
df
First Second Value
0 KAT1 E 20
1 KAT1 M 28
2 KAT2 M 25
3 KAT3 E 26
4 KAT3 E 24
5 KAT4 E 19
6 KAT4 M 23
7 KAT4 M 24
8 KAT4 E 25
首先,它需要按“First”列分組,然后按“Second”分組,優先選擇“E”值。 然后找到該子組中的最大值。 如果“E”不存在,則需要檢查“M”,並在該子組中找到最大值。 可以綁定值,然后將兩者作為 True 寫入新列。
預期 output:
First Second Value Ismax
0 KAT1 E 20 True
1 KAT1 M 28 False
2 KAT2 M 25 True
3 KAT3 E 26 True
4 KAT3 E 24 False
5 KAT4 E 19 False
6 KAT4 M 23 False
7 KAT4 M 24 False
8 KAT4 E 25 True
如果Second
列中只有E
和M
值,您可以使用:
#get E rows
m1 = df['Second'].eq('E')
#get groups with at least one E per First
m2 = df['First'].isin(df.loc[m1, 'First'])
#filter E groups if exist else M groups (like KAT2) and compare maximum
df['Ismax'] = df[(m1 & m2) | (~m1 & ~m2)]
.groupby('First')['Value'].transform('max').eq(df['Value'])
print (df)
First Second Value Ismax
0 KAT1 E 20 True
1 KAT1 M 28 False
2 KAT2 M 25 True
3 KAT3 E 26 True
4 KAT3 E 24 False
5 KAT4 E 19 False
6 KAT4 M 23 False
7 KAT4 M 24 False
8 KAT4 E 25 True
詳情:
print (df[(m1 & m2)])
First Second Value
0 KAT1 E 20
3 KAT3 E 26
4 KAT3 E 24
5 KAT4 E 19
8 KAT4 E 25
print (df[(~m1 & ~m2)])
First Second Value
2 KAT2 M 25
print (df[(m1 & m2) | (~m1 & ~m2)])
First Second Value
0 KAT1 E 20
2 KAT2 M 25
3 KAT3 E 26
4 KAT3 E 24
5 KAT4 E 19
8 KAT4 E 25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.