重命名列的条目,然后在pandas中分组

时间:2017-08-07 05:49:21

标签: python pandas dataframe pandas-groupby

假设我有两个名为“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区域。 但是,我觉得存在一种较短的方法。有关替代方案的任何建议吗?

2 个答案:

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