我在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中你会进一步限制查询,这就是我被卡住的地方 - 熊猫怎么办?或者是否有更简单的方法!
干杯!
菲尔。
答案 0 :(得分:2)
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