子集堆叠的pandas数据帧

时间:2016-05-03 02:57:37

标签: python pandas

我有一个带有小样本的数据框,如下所示:

    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种作物的数据框。

1 个答案:

答案 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
...