我有一个像这样的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()
答案 0 :(得分:0)
您不能缩短这个时间。
df.groupby(['State'])['Population'].nlargest(2)\
.sum(level=0).sort_values(ascending=False).index[:2].tolist()
无需转换回数据框以返回状态,只需直接从索引获取状态即可。将sum
与level
参数一起使用只是简短的语法,再次遍历了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
)
这是对每种操作进行说明的另一种方法