Python:使用False/True将两个panda数据帧与pivot函数连接/合并

Python:使用False/True将两个panda数据帧与pivot函数连接/合并,python,pandas,boolean,pivot,Python,Pandas,Boolean,Pivot,我有两个数据帧: 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],'it

我有两个数据帧:

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
谢谢大家!

您可以使用with和aggregate,然后将值转换为
bool
-
0
False
1,2…
True
。最后的值被转换为
int
-
0
1

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
另一个解决方案包括:


您可以直接查看它们:

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

我想你误解了这个问题,请查看下面的答案@jezrael@valenzio我将其更改为删除重复的列,但我不知道为什么Z列会消失。如果我这样做,我会得到一个完全不同的数据帧。此外,第一个数据帧被称为df1,而不是df,这样更容易复制paste@valenzio很抱歉,刚刚发现了问题所在,drop_duplicates()没有考虑索引,现在必须正常工作。
    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