我有一个带有小样本的数据框,如下所示:
Country Item mean_area
84 Albania Sunflower seed 1900
85 Albania Tangerines, mandarins, clementines, satsumas 0
86 Albania Tobacco, unmanufactured 5700
87 Albania Tomatoes 5400
88 Albania Vegetables, freshnes 0
89 Albania Vegetables, leguminousnes 20
90 Albania Vetches 6200
91 Albania Watermelons 8300
92 Algeria Wheat 112000
93 Algeria Almonds, with shell 27150
完整的数据框位于:https://www.dropbox.com/s/b413htrn39m2wzg/zzzzz.csv?dl=0
我想根据mean_area的总和选择前10个国家(完整数据框有近200个国家),并选择每个国家的前5个作物(再次基于mean_area)
我可以根据mean_area获得前10个国家/地区:
df = (df_stacked
.loc[df_stacked['Country']
.isin(df_stacked.groupby('Country')
.sum()
.nlargest(10, 'mean_area').index)])
如何将其转换为每个国家/地区只有前5种作物的数据框。
答案 0 :(得分:1)
按平均面积总数获取前10个国家的列表。
top10 = df.groupby('Country_FAO', sort=False).mean_area.sum().nlargest(10).index
根据前10名对您的数据框进行子集。
df = df[df.Country_FAO.isin(top10)]
获得前10个国家/地区总数(在最后一步中进行排序)。
df['country_total'] = df.groupby(['Country_FAO']).mean_area.transform(sum)
按国家/地区排序前10名,然后按降序排列mean_area,按国家/地区排序并使用head(5)
排名前5位,然后使用国家/地区总数按降序排序结果(即最大排名第一)每个项目的mean_area。
>>> (df
.sort_values(['Country_FAO', 'mean_area'], ascending=False)
.groupby('Country_FAO')
.head(5)
.sort_values(['country_total', 'mean_area'], ascending=False))
Country_FAO Item mean_area country_total
3201 India Rice, paddy 44712000 177423048
3218 India Wheat 27486000 177423048
3182 India Millet 13012200 177423048
3206 India Sorghum 9856400 177423048
3204 India Seed cotton 8576500 177423048
1440 China Rice, paddy 29961890 160425183
1470 China Wheat 26653290 160425183
1410 China Maize 23056270 160425183
1449 China Soybeans 9306760 160425183
1439 China Rapeseed 7494360 160425183
7458 USA Maize 29315744 101345306
7489 USA Soybeans 29302790 101345306
7505 USA Wheat 21474065 101345306
7486 USA Seed cotton 5282000 101345306
7488 USA Sorghum 3126630 101345306
...