[英]Retrieve rows with highest value with condition
我有一个看起来像这样的 dataframe:
| Id | Label | Width |
|----|-------| ------|
| 0 | A | 5 |
| 0 | A | 3 |
| 0 | B | 4 |
| 1 | A | 7 |
| 1 | A | 9 |
我想写一个 function 获取具有相同 id 和 label A 的行并根据最高宽度对其进行过滤
所以在应用 function 之后, dataframe 将是:
| Id | Label | Width |
|----|-------| ------|
| 0 | A | 5 |
| 0 | B | 4 |
| 1 | A | 9 |
让我们试试:
m = df['Label'].eq('A')
df_a = df.loc[df[m].groupby(['Id', 'Label'])['Width'].idxmax()]
df_out = pd.concat([df[~m], df_a]).sort_index()
细节:
使用.eq
创建一个 boolean 掩码,指定Label
等于A
的条件:
>>> m
0 True
1 True
2 False
3 True
4 True
Name: Label, dtype: bool
使用上述掩码过滤行并将此 dataframe 分组到Id
和Label
并使用idxmax
聚合Width
以获得最大值的索引:
>>> df[m].groupby(['Id', 'Label'])['Width'].idxmax().tolist()
[0, 4]
>>> df_a
Id Label Width
0 0 A 5
4 1 A 9
最后将上述concat
与包含除A
以外的标签的 dataframe 连接,并对索引进行sort
以保持顺序:
>>> df_out
Id Label Width
0 0 A 5
2 0 B 4
4 1 A 9
您可以使用groupby
来获得您想要的结果:
df.groupby(['Id','Label'],as_index=False)['Width'].max()
Id Label Width
0 0 A 5
1 0 B 4
2 1 A 9
并将其与set_index()
和loc
结合,以获得更具体的结果:
label = 'A'
df.groupby(['Id','Label'],as_index=False)['Width'].max().set_index('Label').loc[label]
Id Width
Label
A 0 5
A 1 9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.