外部连接将右边的缺失值添加为零或 NaN
Outer Join adding Missing Values from Right as Zeroes or NaN
我正在尝试以一种非常具体的方式合并两个 PANDAS df。
DF1 =
Name Color
Tom Blue
Frank Red
John Green
Sarah Red
DF2 =
Name Shape Value
Tom Circle 4
Tom Square 4
Frank Triangle 7
John Square 2
Sarah Circle 1
期望的结果 = DFM =
Name Color Shape Value
Tom Blue Circle 4
Frank Red Circle 0
John Green Circle 0
Sarah Red Circle 1
Tom Blue Square 4
Frank Red Square 0
John Green Square 2
Sarah Red Square 0
Tom Blue Triangle 0
Frank Red Triangle 7
John Green Triangle 0
Sarah Red Triangle 0
外连接提供了我想要的大部分内容,但没有提供零。寻找有关执行此操作的优雅方法的一些见解。零或简单的 NaN 都可以,因为我可以用零替换 NaN。
您可以将 merge
与 unstack
一起使用
s=df2.merge(df1,on='Name',how='outer')
s.set_index(['Name','Color','Shape']).Value.unstack(-1,fill_value=0).stack().reset_index().sort_values(['Shape','Name'])
Out[263]:
Name Color Shape 0
0 Frank Red Circle 0
3 John Green Circle 0
6 Sarah Red Circle 1
9 Tom Blue Circle 4
1 Frank Red Square 0
4 John Green Square 2
7 Sarah Red Square 0
10 Tom Blue Square 4
2 Frank Red Triangle 7
5 John Green Triangle 0
8 Sarah Red Triangle 0
11 Tom Blue Triangle 0
我正在尝试以一种非常具体的方式合并两个 PANDAS df。
DF1 =
Name Color
Tom Blue
Frank Red
John Green
Sarah Red
DF2 =
Name Shape Value
Tom Circle 4
Tom Square 4
Frank Triangle 7
John Square 2
Sarah Circle 1
期望的结果 = DFM =
Name Color Shape Value
Tom Blue Circle 4
Frank Red Circle 0
John Green Circle 0
Sarah Red Circle 1
Tom Blue Square 4
Frank Red Square 0
John Green Square 2
Sarah Red Square 0
Tom Blue Triangle 0
Frank Red Triangle 7
John Green Triangle 0
Sarah Red Triangle 0
外连接提供了我想要的大部分内容,但没有提供零。寻找有关执行此操作的优雅方法的一些见解。零或简单的 NaN 都可以,因为我可以用零替换 NaN。
您可以将 merge
与 unstack
s=df2.merge(df1,on='Name',how='outer')
s.set_index(['Name','Color','Shape']).Value.unstack(-1,fill_value=0).stack().reset_index().sort_values(['Shape','Name'])
Out[263]:
Name Color Shape 0
0 Frank Red Circle 0
3 John Green Circle 0
6 Sarah Red Circle 1
9 Tom Blue Circle 4
1 Frank Red Square 0
4 John Green Square 2
7 Sarah Red Square 0
10 Tom Blue Square 4
2 Frank Red Triangle 7
5 John Green Triangle 0
8 Sarah Red Triangle 0
11 Tom Blue Triangle 0