2017-08-07 5 views
1

"country_to_country"と "country_area_mapping"という名前の2つのデータフレームがあるとします。列のエントリの名前を変更してから、パンダで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 

"From"列に "merge"を2回使用し、 "To"列に結果をマージしました。最後に、同じFrom-To領域のボリュームを合計するために "groupby"を適用します。 しかし、私はそうする短い方法が存在すると思う。代わりの提案はありますか?

答えて

2

あなたはsumを集約してSeriesによってDataFrame.replace、その後groupbyを使用することができます。

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 
関連する問題