2017-06-14 25 views
1

我有两个数据帧合并两个熊猫据帧具有旋转功能:的Python:加入/使用假/真

import pandas as pd 
df1 = pd.DataFrame({'id': [1, 2,3],'param1': ['foo','bar','fu'],'param2': ['fo', 'ba','bar']}) 

    id param1 param2 
0 1 foo  fo 
1 2 bar  ba 
2 3  fu bar 

df2 = pd.DataFrame({'id': [1, 1,1,2,2,3],'item': ['X','Y','Z','X','Z','Y'],}) 

    id item 
0 1 X 
1 1 Y 
2 1 Z 
3 2 X 
4 2 Z 
5 3 Y 

我想加入/两帧与关键id合并。不过,我想帧进行扩大,使每一个独特的项目变成自己的列,每一行充满了0或1。我猜它是一种具有枢转马平,可能吗?决赛桌应该是这样的:

id param1 param2 X Y Z 
0 1 foo  fo 1 1 1 
1 2 bar  ba 1 0 1 
2 3  fu bar 0 1 0 

谢谢!

回答

2

您可以使用joingroupby和骨料size,然后这些值转换为bool - 0False1,2...True。最后值转换为int - 01

print (df1.join(df2.groupby(['id', 'item']) 
        .size() 
        .unstack(fill_value=0) 
        .astype(bool) 
        .astype(int), on='id')) 

    id param1 param2 X Y Z 
0 1 foo  fo 1 1 1 
1 2 bar  ba 1 0 1 
2 3  fu bar 0 1 0 

crosstab另一种解决方案:

print (df1.join(pd.crosstab(df2['id'], df2['item']).astype(bool).astype(int), on='id')) 
    id param1 param2 X Y Z 
0 1 foo  fo 1 1 1 
1 2 bar  ba 1 0 1 
2 3  fu bar 0 1 0 
+0

工程就像一个魅力,谢谢! – valenzio

0

你可以只Concat的他们:

df_final = pd.concat([df1,df2],axis=1) 
df_final = df_final.transpose().reset_index().drop_duplicates() 
df_final = df_final.set_index('index').transpose() 

输出:

id param1 param2 X Y Z 
0 1 foo  fo  1 1 1 
1 2 bar  ba  1 0 1 
2 3 fu  bar  0 1 0 
+0

我想你误解了这个问题,从@jezrael – valenzio

+0

检查出的答案@valenzio我改变了它砸重复列,但我没有想法,为什么在Z列在前看不见 – Tbaki

+0

所以,如果我这样做,我得到一个完整的数据帧不同。也是第一个数据帧被称为DF1,不是那么很容易复制粘贴刚刚df,可以 – valenzio