我正在尝试理解/使用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”(正如我所料)。
答案 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
- count
和name
。这就是delta
被选为max
列name
的原因。
如果您只对最大数量感兴趣,请使用
df.groupby('year')['count'].max()
df.groupby('year')
是DataFrameGroupBy
个对象。
df.groupby('year')['count']
是SeriesGroupBy
个对象。对max
对象的idxmax
或SeriesGroupBy
的调用仅使用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