Python:Join/merge 两个具有枢轴函数的熊猫数据框使用 False/True

Python: Join/merge two panda dataframe with pivot function using False/True

我有两个数据框:

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

我喜欢 join/merge 两帧的关键 id。但是我希望扩展框架,以便每个独特的项目成为自己的列,并且每一行都填充 0 或 1。我猜它是一种带有枢轴的映射,也许吧?最后的 table 应该是这样的:

   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

谢谢!

您可以使用 join with groupby and aggregate 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

你可以直接连接它们:

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