2017-03-24 4 views
1

を生産パンダに自己参加私は形式でパンダのデータフレームのデータを持っている:不要な重複

CompanyA, CompanyB, Currency, Item, Amount

典型的な行は次のようになります。

Microsoft,Oracle,USD,Item_X,252.23 
Microsoft,Oracle,USD,Item_Y,234.23 
Microsoft,Oracle,EUR,Item_X,23352.00 
Microsoft,Oracle,EUR,Item_Y,23344.80 
Microsoft,IBM,GBP,Item_X,123.12 
Microsoft,IBM,GBP,Item_Y,432.12 
Oracle,IBM,EUR,Item_X,999.23 
Oracle,IBM,EUR,Item_Y,234.23 

金額フロートであれば、他の人を文字列です。

アイテムの項目を展開して、各項目の項目が独自の列を取得するようにしました。ここには金額が含まれています。基本的に、データを長くするのではなく、より広くする。

df = pd.merge(df, df, on=['CompanyA', 'CompanyB', 'Currency']) 

これは、ほぼ右の出力を生成し、それはそれぞれの行を4回参加する:

を、私はのようなものを試してみた - 自己結合する必要がありますように感じる

CompanyA, CompanyB, Currency, Item_X, Item_Y 

Microsoft,Oracle,USD,252.23, 234.23 
Microsoft,Oracle,EUR,,23352.00,23344.80 
... and so on. 

Item_X -> Item_X 
Item_X -> Item_Y 
Item_Y -> Item_X 
Item_Y -> Item_Y 

私は明らかにItem_X - > Item_Yに興味があります。

SQLでは、さらにクエリに拘束されますが、これは私が立ち往生しているところです - パンダではどうしたらいいですか?または、より簡単な方法がありますか?

乾杯!

フィル。

答えて

2

私はあなたがunstackset_indexが必要だと思う:

df = df.set_index(['CompanyA','CompanyB','Currency','Item'])['Amount'] 
     .unstack() 
     .reset_index() 

print (df) 
Item CompanyA CompanyB Currency Item_X Item_Y 
0  Microsoft  IBM  GBP 123.12 432.12 
1  Microsoft Oracle  EUR 23352.00 23344.80 
2  Microsoft Oracle  USD 252.23 234.23 
3  Oracle  IBM  EUR 999.23 234.23 

場合や、重複が集約関数でpivot_tableが必要になります。

print (df) 
    CompanyA CompanyB Currency Item Amount 
0 Microsoft Oracle  USD Item_X 252.23 
1 Microsoft Oracle  USD Item_Y 234.23 
2 Microsoft Oracle  EUR Item_X 23352.00 
3 Microsoft Oracle  EUR Item_Y 23344.80 
4 Microsoft  IBM  GBP Item_X 123.12 
5 Microsoft  IBM  GBP Item_Y 432.12 
6  Oracle  IBM  EUR Item_X 999.23 
7  Oracle  IBM  EUR Item_Y  10.00 <-same values, only Amount different 
8  Oracle  IBM  EUR Item_Y  20.00 <-same values, only Amount different 


df = df.pivot_table(index=['CompanyA','CompanyB','Currency'], 
        columns='Item', 
        values='Amount', 
        aggfunc='mean').reset_index() 
print (df) 
Item CompanyA CompanyB Currency Item_X Item_Y 
0  Microsoft  IBM  GBP 123.12 432.12 
1  Microsoft Oracle  EUR 23352.00 23344.80 
2  Microsoft Oracle  USD 252.23 234.23 
3  Oracle  IBM  EUR 999.23  15.00 
+0

が、これは私が望んでいたまさにです、ありがとうございました。私はピボット解決策に近いので、aggfuncを指定しませんでした。なぜなら、私のデータセットではaggfuncが意味をなさないからです。複製は存在しないので、私はaggfuncのために何かを置くことができ、結果は有効です....しかし、重複がなければ、おそらくアンスタックを実行する方が速いでしょうか? – Phil

+0

はい、正確です。高速化は最初の解決策ですが、重複するとエラーが発生します。別の解決策を使用することも可能です。 – jezrael

関連する問題