我有一个这样的数据框:
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
列进行分组,使得值的数量较少,然后在val
和from_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) {};
};
答案 0 :(得分:1)
基于@ EdChum的想法,您可以将df['sector'].map(agg)
与其他两列from_country
和to_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