pandas:如何选择每个 GROUP BY 组中的第一行?

新手上路,请多包涵

基本上和 Select first row in each GROUP BY group一样? 仅在熊猫中。

 df = pd.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar'],
                'B' : ['3', '1', '2', '4','2', '4', '1', '3'],
                    })

排序看起来很有希望:

 df.sort('B')

     A  B
1  foo  1
6  bar  1
2  foo  2
4  bar  2
0  foo  3
7  bar  3
3  foo  4
5  bar  4

但是首先不会给出想要的结果…… df.groupby(‘A’).first()

      B
A
bar  2
foo  3

原文由 ihadanny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 635
2 个回答

通常,如果您希望您的数据按 groupby 排序,但它不是要分组的列之一,那么最好在执行 sort 之前执行 df groupby

 In [5]:
df.sort_values('B').groupby('A').first()

Out[5]:
     B
A
bar  1
foo  1

原文由 EdChum 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是使用 groupby().rank() 的替代方法:

 df[ df.groupby('A')['B'].rank() == 1 ]

     A  B
1  foo  1
6  bar  1

这为您提供了与@EdChum 对 OP 示例数据框的相同答案,但如果您在排序过程中有任何关系,例如,使用如下数据,则可能会给出不同的答案:

 df = pd.DataFrame({'A': ['foo', 'foo', 'bar', 'bar'],
                   'B': ['2', '1', '1', '1'] })

在这种情况下,您有一些选项使用可选的 method 参数,具体取决于您希望如何处理排序关系:

 df[ df.groupby('A')['B'].rank(method='average') == 1 ]   # the default
df[ df.groupby('A')['B'].rank(method='min')     == 1 ]
df[ df.groupby('A')['B'].rank(method='first')   == 1 ]   # doesn't work, not sure why

原文由 JohnE 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题