Python Pandas Groupby行为

时间:2014-09-12 19:29:41

标签: python pandas group-by ipython

我正在尝试理解/使用Pandas中的groupby来获取每个组中的最大计数,然后返回具有最大计数的行

df = pd.DataFrame({'name':['alpha','beta','gamma','delta','epsilon'], 'year':[2000,2001,2000,2001,2000], 'count':[1,25,11,20,8]})
df


    count   name    year
0   1       alpha   2000
1   25      beta    2001
2   11      gamma   2000
3   20      delta   2001
4   8       epsilon 2000

df.groupby('year').max()

        count   name
year        
2000    11      gamma
2001    25      delta

我按年分组,但我希望输出看起来像:

        count   name
year        
2000    11      gamma
2001    25      beta

所以,我想根据最大数量从每个组返回整行(按'年')。我也不清楚为什么2001年会在名称中返回“delta”而不是“beta”(正如我所料)。

2 个答案:

答案 0 :(得分:1)

您可以使用idxmax收集最大行的索引,然后使用df.iloc选择行:

In [73]: df.iloc[df.groupby('year')['count'].idxmax()].set_index('year')
Out[73]: 
      count   name
year              
2000     11  gamma
2001     25   beta

请注意,df.groupby('year').max()正在为每列找到max - countname。这就是delta被选为maxname的原因。

如果您只对最大数量感兴趣,请使用

df.groupby('year')['count'].max()

df.groupby('year')DataFrameGroupBy个对象。 df.groupby('year')['count']SeriesGroupBy个对象。对max对象的idxmaxSeriesGroupBy的调用仅使用count列中的值。这种限制GroupBy对象的方法是documented here

答案 1 :(得分:0)

您可以使用常规groupby().apply并返回count等于群组最大count的行。与其他答案一样,set_index用于删除额外的year列。

>>> df = pd.DataFrame({'name':['alpha','beta','gamma','delta','epsilon'], 'year':[2000,2001,2000,2001,2000], 'count':[1,25,11,20,8]})

>>> df.groupby("year").apply(lambda g: g[g["count"] == g["count"].max()]).set_index("year")
      count   name
year              
2000     11  gamma
2001     25   beta