在DataFrame中进行分组,求和,排序和选择

时间:2019-11-25 18:37:36

标签: python pandas

我有一个像这样的DataFrame:

df=pd.DataFrame({'State' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
            'County' : ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'],
            'Population': [10, 11, 12, 13, 17, 16, 15, 18, 14]})

查看每个州的人口最多的两个县,哪个人口最多的两个州是什么(按人口从高到低的顺序排列)?

我通过使用循环来解决它,现在我试图将相同的结果分组,求和,排序和选择。 以下代码可以正常工作,但是我敢肯定有很多不同且更优雅的方法来实现它。

df.groupby(['State'])['Population'].nlargest(2).groupby(['State']).sum()\
  .sort_values(ascending=False)[:2].to_frame()\
  .reset_index()['State'].tolist()

2 个答案:

答案 0 :(得分:0)

您不能缩短这个时间。

df.groupby(['State'])['Population'].nlargest(2)\
  .sum(level=0).sort_values(ascending=False).index[:2].tolist()

无需转换回数据框以返回状态,只需直接从索引获取状态即可。将sumlevel参数一起使用只是简短的语法,再次遍历了groupby。

答案 1 :(得分:0)

(df.sort_values('Population', ascending=False) # order by highest population per country 
.groupby('State').head(2) # get two most populous counties per state
 .groupby('State').sum() # get population of two largest counties per state
 .sort_values('Population', ascending = False)[:2] # get top 2 states by population
 .index # get states names
 .tolist() # convert to list
)

这是对每种操作进行说明的另一种方法