Python按行为分组
我试图理解/使用Pandas中的groupby来获取每个组中的最大计数,然后返回具有最大计数的行Python按行为分组,python,pandas,group-by,ipython,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
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,正如我所期望的那样。您可以使用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正在查找每列的最大值-计数和名称。这就是为什么在名称列中将delta选为max
如果您只对最大计数感兴趣,请使用
df.groupby('year')['count'].max()
groupby'year'是一个DataFrameGroupBy对象。
groupby'year'['count']是一个SeriesGroupBy对象。SeriesGroupBy对象上对max或idxmax的调用仅使用count列中的值。此限制GroupBy对象的方法是。您可以使用general GroupBy.apply并返回其计数等于组最大计数的行。与另一个答案一样,set_索引用于删除额外年份列
它给出delta的原因是,当您直接对groupby对象执行.max操作时,它会分别为每列计算max。delta在字母表中较晚,因此大于beta。@unubtu:您能解释一下:为什么我的命令返回delta而不是beta吗?那么df.groupby'year'['count']是做什么的呢?我理解df.groupby'year',但我无法理解['count']部分 >>> 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