例如,我有下表:
index,A,B 0,0,0 1,0,8 2,0,8 3,1,0 4,1,5
分组后A:
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
B组中列中的行的最大值0: 8
0
所以我想删除带有索引的行,0并保留带有索引的行1,2
1
2
B组中列中的行的最大值1: 5
所以我想删除带有索引的4行并保留带有索引的行3
4
3
我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行:
data = <example table> grouped = data.groupby("A") filtered = grouped.filter(lambda x: x["B"] == x["B"].max())
因此,理想情况下,我需要一个过滤器,该过滤器会遍历组中的所有行。
感谢帮助!
PS还有没有办法只删除组中的行而不返回DataFrame对象?
DataFrame
您只需要apply在groupby对象上使用。我修改了示例数据,使其更加清晰:
apply
groupby
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