我有这些数据帧:
rec = pd.DataFrame({'batch': ["001","002","003"],
'A': [1, 2, 3],
'B': [4, 5, 6]})
ing1 = pd.DataFrame({'batch': ["002","003","004"],
'C': [12, 13, 14],
'D': [15, 16, 17],
'E': [18, 19, 10]})
ing2 = pd.DataFrame({'batch': ["001","011","012"],
'C': [20, 21, 22],
'D': [23, 24, 25],
'F': [26, 27, 28]})
我想要的是以下合并数据集,其中具有相同标签的列将被稍后合并的日期集覆盖,并为不存在的标签创建新列
batch A B C D E F
0 001 1 4 20 23 NaN 26.0
1 002 2 5 12 15 18.0 NaN
2 003 3 6 13 16 19.0 NaN
我已尝试首先将rec
与ing1
合并:
final = pd.merge(rec, ing1, how ='left', on='batch', sort=False)
中间结果:
batch A B C D E
0 001 1 4 NaN NaN NaN
1 002 2 5 12.0 15.0 18.0
2 003 3 6 13.0 16.0 19.0
然后,我将第二次与ing2
合并,以获得C、D和E列中缺少的信息
final = pd.merge(final, ing2, how ='left', on='batch', sort=False)
结果(不符合预期):
batch A B C_x D_x E C_y D_y F
0 001 1 4 NaN NaN NaN 20.0 23.0 26.0
1 002 2 5 12.0 15.0 18.0 NaN NaN NaN
2 003 3 6 13.0 16.0 19.0 NaN NaN NaN
我还尝试了merge
、concat
和combinefirst
,但是它们似乎在将第二个表中的数据附加到主表的地方运行。我能想到的唯一方法是将数据帧拆分为需要从ing1
提取数据的行和需要ing2
提取数据的行,然后将它们彼此附加到最后的数据集
实际上,df.update()可能是概念上最接近您所要求的函数。但是,您必须预先设置索引并预分配输出数据帧。这可能会也可能不会比
.merge()
造成更多的麻烦代码:
结果:
合并后直接应用
np.where()
怎么样?如果右边的列(后缀为“_y”)不是NA,则选择右边,否则选择左边输出
相关问题 更多 >
编程相关推荐