繁体   English   中英

使用条件检索具有最高值的行

[英]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 分组到IdLabel并使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM