如何有条件地合并两列

时间:2018-10-31 15:55:36

标签: python pandas

我有一个这样的数据框:

df_ex_A = pd.DataFrame({'X':['r','r','t','t','v','w'],
                        'A':[3,4,1,2,1,1],
                        'A_val':[25,25,100,20,10,90]})
 Out[115]: 
  X  A  A_val
0 r  3     25
1 r  4     25
2 t  1     100
3 t  2     20
4 v  1     10
5 w  1     90

和另一个类似的df:

df_ex_B = pd.DataFrame({ 'X':['r','r','t','t','v','w'],
                    'B':[4,5,2,3,2,2],
                    'B_val':[75,65,30,0,0,0]})
    Out[117]: 
  X  B   B_val
0 r  4     75
1 r  5     65
2 t  2     30
3 t  3      0
4 v  2      0
5 w  2      0

我想通过对A和B的相等值进行合并操作来创建df,如下所示:

   X  (A==B)  A_val   B_val
0  r     3     25       0
1  r     4     25       75
2  r     5     0        65
3  t     1     1        0
4  t    2     20       30
5  t     3      0       0
6  v     1     10       0
7  v     2      0       0
8  w     1     90       0
9  w     2     0        0

如何执行合并以获取此df? 谢谢

2 个答案:

答案 0 :(得分:2)

让我们尝试使用set_indexpd.concat

dfA = df_ex_A.set_index(['X','A']).rename_axis(['X','A==B'])

dfB = df_ex_B.set_index(['X','B']).rename_axis(['X','A==B'])

pd.concat([dfA,dfB], axis=1).fillna(0).reset_index()

输出:

   X  A==B  A_val  B_val
0  r     3   25.0    0.0
1  r     4   25.0   75.0
2  r     5    0.0   65.0
3  t     1  100.0    0.0
4  t     2   20.0   30.0
5  t     3    0.0    0.0
6  v     1   10.0    0.0
7  v     2    0.0    0.0
8  w     1   90.0    0.0
9  w     2    0.0    0.0

或者您可以在设置索引并重命名轴后使用join

dfA.join(dfB, how='outer').fillna(0).reset_index()

输出:

   X  A==B  A_val  B_val
0  r     3   25.0    0.0
1  r     4   25.0   75.0
2  r     5    0.0   65.0
3  t     1  100.0    0.0
4  t     2   20.0   30.0
5  t     3    0.0    0.0
6  v     1   10.0    0.0
7  v     2    0.0    0.0
8  w     1   90.0    0.0
9  w     2    0.0    0.0

答案 1 :(得分:2)

我认为您想要的是outer join,可以通过merge指定how='outer'来完成:

df_ex_A.merge(df_ex_B.rename(columns={'B':'A'}), how='outer').fillna(0).rename(columns={'A':'A==B'})