假设我有两个名为“country_to_country”和“country_area_mapping”的数据框,如下所示。
>>> country_to_country
From To Volume
0 c1 c4 10
1 c2 c5 20
2 c3 c6 30
>>> country_area_mapping
Country Area
0 c1 a1
1 c2 a2
2 c3 a1
3 c4 a2
4 c5 a1
5 c6 a2
预期输出为:
From To Volume
0 a2 a1 40
1 a2 a1 20
其中国家/地区名称应替换为相应的区域,然后使用“总计”列中的总和进行分组。
我的方法是对“From”列使用“merge”两次,然后将结果合并到“To”列。最后,应用“groupby”来汇总相同的From-To区域。 但是,我觉得存在一种较短的方法。有关替代方案的任何建议吗?
答案 0 :(得分:2)
您可以Series
使用DataFrame.replace
,然后使用groupby
聚合sum
:
s = country_area_mapping.set_index('Country')['Area']
df = country_to_country.replace({'From':s, 'To':s})
.groupby(['From','To'], as_index=False)['Volume'].sum()
print (df)
From To Volume
0 a1 a2 40
1 a2 a1 20
答案 1 :(得分:1)
创建映射:
In [62]: mapping = dict(country_area_mapping[['Country', 'Area']].values)
显式索引是为了在生成映射时保证顺序。现在使用df.replace
后跟df.groupby
:
In [64]: country_to_country.replace(mapping).groupby(['From', 'To'], as_index=False).sum()
Out[64]:
From To Volume
0 a1 a2 40
1 a2 a1 20