2017-08-07 42 views
1

假設我需要兩個名爲「country_to_country」和「country_area_mapping」的數據框,如下所示。重命名該列的條目,然後重命名爲pandas中的groupby

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

如果國名應與相應的區域,然後組通過使用卷之列的表來代替。

我的做法是將「合併」兩次用於「發件人」列,然後合併「收件人」列中的結果。最後,應用「groupby」將相同的From - To區域音量相加。 但是,我覺得有一個更短的方法來做到這一點。任何建議替代?

回答

2

您可以使用SeriesDataFrame.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

創建一個映射:

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