小编典典

Python Pandas-在groupby之后过滤行

python

例如,我有下表:

index,A,B
0,0,0
1,0,8
2,0,8
3,1,0
4,1,5

分组后A

0:
index,A,B
0,0,0
1,0,8
2,0,8

1:
index,A,B
3,1,5
4,1,3

我需要的是删除每个组中的行,其中列中的数量B小于组中column的所有行中的最大值B。好吧,我在将这个问题翻译和表达为英语时遇到了问题,因此这里是示例:

B组中列中的行的最大值08

所以我想删除带有索引的行,0并保留带有索引的行12

B组中列中的行的最大值15

所以我想删除带有索引的4行并保留带有索引的行3

我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行:

data = <example table>
grouped = data.groupby("A")
filtered = grouped.filter(lambda x: x["B"] == x["B"].max())

因此,理想情况下,我需要一个过滤器,该过滤器会遍历组中的所有行。

感谢帮助!

PS还有没有办法只删除组中的行而不返回DataFrame对象?


阅读 292

收藏
2020-12-20

共1个答案

小编典典

您只需要applygroupby对象上使用。我修改了示例数据,使其更加清晰:

import pandas
from io import StringIO

csv = StringIO("""index,A,B
0,1,0.0
1,1,3.0
2,1,6.0
3,2,0.0
4,2,5.0
5,2,7.0""")

df = pandas.read_csv(csv, index_col='index')
groups = df.groupby(by=['A'])
print(groups.apply(lambda g: g[g['B'] == g['B'].max()]))

哪些打印:

         A  B
A index      
1 2      1  6
2 4      2  7
2020-12-20