将值转换为更少的类别并汇总

时间:2015-08-26 15:51:09

标签: python pandas

我有一个这样的数据框:

In [73]: df
Out[73]: 
         sector from_country to_country            val
0   Agriculture          DEU        DEU       0.000000
1   Agriculture          DEU        USA     189.885777
2   Agriculture          USA        DEU    1087.252361
3   Agriculture          USA        USA       0.000000
4          Food          DEU        DEU       0.000000
5          Food          DEU        USA    1369.047822
6          Food          USA        DEU     954.436445
7          Food          USA        USA       0.000000
8          Wood          DEU        DEU       0.000000
9          Wood          DEU        USA     151.803567
10         Wood          USA        DEU     122.148539
11         Wood          USA        USA       0.000000

我想对sector列进行分组,使得值的数量较少,然后在valfrom_country的级别上汇总to_country

如果汇总是这样的:

agg = {'Agriculture': 'a', 'Food': 'a', 'Wood': 'b'}

然后我希望输出看起来像:

  agg    from_country    to_country val
    a             DEU           DEU 0
                  DEU           USA 1558.933599
                  USA           DEU 2041.688806
                  USA           USA 0
    b             DEU           DEU 0
                  DEU           USA 151.803567
                  USA           DEU 122.148539
                  USA           USA 0

尽管我已经阅读了GroupBy关于In [81]: df.set_index(['sector', 'from_country', 'to_country']).groupby(agg, level='sector').sum() Out[81]: val sector a 3600.622404 b 273.952107 的字典,但我似乎无法将其付诸实践。

我能得到的最接近的是:

struct THREAD_DATA
{
    int ms;
    DWORD id;
    THREAD_DATA(DWORD _id, int _ms) : id(_id), ms(_ms) {};
};

1 个答案:

答案 0 :(得分:1)

基于@ EdChum的想法,您可以将df['sector'].map(agg)与其他两列from_countryto_country一起用作外部列来执行groupby。 (默认设置as_index=True将确保这三个外部列将显示为索引,从而包含在结果中。)

df['val'].groupby([df['sector'].map(agg), df['from_country'], df['to_country']]).sum().reset_index()

  sector from_country to_country        val
0      a          DEU        DEU     0.0000
1      a          DEU        USA  1558.9336
2      a          USA        DEU  2041.6888
3      a          USA        USA     0.0000
4      b          DEU        DEU     0.0000
5      b          DEU        USA   151.8036
6      b          USA        DEU   122.1485
7      b          USA        USA     0.0000