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
- 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
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
我有两个数据框:
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
- 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
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