【发布时间】:2019-07-02 22:17:24
【问题描述】:
我有一个有趣的!而且我试图找到一个重复的问题,但没有成功...
我的数据框包含 2013-2016 年的所有美国和地区,并具有多个属性。
>>> df.head(2)
state enrollees utilizing enrol_age65 util_age65 year
1 Alabama 637247 635431 473376 474334 2013
2 Alaska 30486 28514 21721 20457 2013
>>> df.tail(2)
state enrollees utilizing enrol_age65 util_age65 year
214 Puerto Rico 581861 579514 453181 450150 2016
215 U.S. Territories 24329 16979 22608 15921 2016
我想按年份和州分组,并显示每年排名前 3 位的州(按“注册者”或“使用” - 无关紧要)。
期望的输出:
enrollees utilizing
year state
2013 California 3933310 3823455
New York 3133980 3002948
Florida 2984799 2847574
...
2016 California 4516216 4365896
Florida 4186823 3984756
New York 4009829 3874682
到目前为止,我已经尝试了以下方法:
df.groupby(['year','state'])['enrollees','utilizing'].sum().head(3)
仅产生 GroupBy 对象中的前 3 行:
enrollees utilizing
year state
2013 Alabama 637247 635431
Alaska 30486 28514
Arizona 707683 683273
我也试过一个 lambda 函数:
df.groupby(['year','state'])['enrollees','utilizing']\
.apply(lambda x: np.sum(x)).nlargest(3, 'enrollees')
在 GroupBy 对象中产生绝对最大的 3:
enrollees utilizing
year state
2016 California 4516216 4365896
2015 California 4324304 4191704
2014 California 4133532 4011208
我认为这可能与 GroupBy 对象的索引有关,但我不确定...任何指导将不胜感激!
【问题讨论】:
-
添加
.sort_values(by='enrollees', ascending=False)之前.head(3) -
这不会保持 GroupBy 对象按年份排序。它将返回 所有年的前 3 个州(恰好是 2016 年、2015 年和 2014 年的加利福尼亚州)。
-
尝试使用 nlargest(3, ['year', 'enrollees'])?另见stackoverflow.com/questions/47703606/…
-
@DouglasPearson 传递类似 ['year','enrollees'] 的列表不起作用 - 我也尝试过 :( 我认为必须在未用于索引的项目上调用 nlargest groupby。至于链接,该解决方案仅适用于至少有 3 行的组。我的组只有 1 行(每年一个州)。由于我按两列分组,因此它也变得不稳定。跨度>
-
为什么
df.groupby(['State','Year'])['enrollees'].nlargest(3)似乎不起作用??
标签: python pandas pandas-groupby