合并列标签上的数据帧并覆盖匹配行中的其他值

2024-09-29 00:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这些数据帧:

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

我已尝试首先将recing1合并:

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

我还尝试了mergeconcatcombinefirst,但是它们似乎在将第二个表中的数据附加到主表的地方运行。我能想到的唯一方法是将数据帧拆分为需要从ing1提取数据的行和需要ing2提取数据的行,然后将它们彼此附加到最后的数据集


Tags: 数据dataframeonbatch标签mergenansort
2条回答

实际上,df.update()可能是概念上最接近您所要求的函数。但是,您必须预先设置索引并预分配输出数据帧。这可能会也可能不会比.merge()造成更多的麻烦

代码:

# set index
rec.set_index("batch", inplace=True)
ing1.set_index("batch", inplace=True)
ing2.set_index("batch", inplace=True)

# preallocate
final = pd.DataFrame(columns=["A","B","C","D","E","F"], index=rec.index)
# update in order
final.update(rec)
final.update(ing1)
final.update(ing2)

结果:

print(final)

       A  B   C   D    E    F
batch                        
001    1  4  20  23  NaN   26
002    2  5  12  15   18  NaN
003    3  6  13  16   19  NaN

合并后直接应用np.where()怎么样?如果右边的列(后缀为“_y”)不是NA,则选择右边,否则选择左边

final = rec.merge(ing1, how='left', on='batch')\
           .merge(ing2, how='left', on='batch')
final[["C", "D"]] = np.where(~final[["C_y", "D_y"]].isna(), final[["C_y", "D_y"]], final[["C_x", "D_x"]])

输出

print(final[["A","B","C","D","E","F"]])

   A  B     C     D     E     F
0  1  4  20.0  23.0   NaN  26.0
1  2  5  12.0  15.0  18.0   NaN
2  3  6  13.0  16.0  19.0   NaN

相关问题 更多 >