自我加入熊猫产生不必要的重复

时间:2017-03-24 12:51:54

标签: python python-2.7 pandas

我在Pandas数据框中的数据格式为:

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

浮动数量,其他是字符串。

我想将Item列展开,以便每个Item条目都有自己的列,现在包含Amount。基本上使数据更宽,而不是更长。

CompanyA, CompanyB, Currency, Item_X, Item_Y

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

感觉它应该是一个自我加入 - 我尝试过这样的事情:

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

这几乎产生了正确的输出,但它每次连接4次:

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

显然我只对Item_X感兴趣 - > Item_Y。

在SQL中你会进一步限制查询,这就是我被卡住的地方 - 熊猫怎么办?或者是否有更简单的方法!

干杯!

菲尔。

1 个答案:

答案 0 :(得分:2)

我认为set_index需要unstack

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