首页 > 解决方案 > 合并不同大小的数据帧并同时覆盖 NaN 值

问题描述

我想在不同大小的 Python 中组合两个数据框。这些数据框是从 Excel 文件中加载的。第一个数据帧有许多包含 NaN 的空值,第二个数据帧有数据来替换第一个数据帧中的 NaN 值。这两个数据框由第一列中的数据链接,但顺序不同。

我可以使用 merge() 成功合并和组织数据帧,但生成的数据帧有额外的列,因为 NaN 值没有被覆盖。我可以用 fillna() 覆盖 NaN 值,但生成的数据帧是乱序的。有没有什么方法可以执行这种替换 NaN 的合并,而不需要单独的删除和重新排序列的操作?

import pandas as pd
import numpy as np

df1=pd.DataFrame({'A':[1,2,3],'B':[np.nan,np.nan,np.nan],'C':['X','Y','Z']})
df1
   A   B  C
0  1 NaN  X
1  2 NaN  Y
2  3 NaN  Z
df2=pd.DataFrame({'A':[3,1,2],'B':['U','V','W'],'D':[7,8,9]})
df2
   A  B  D
0  3  U  7
1  1  V  8
2  2  W  9

如果我做:

df1.merge(df2,how='left',on='A',sort=True)
   A  B_x  C B_y  D
0  1  NaN  X   V  8
1  2  NaN  Y   W  9
2  3  NaN  Z   U  7

数据是有序的,但 B 有多个实例。如果我做:

df1.fillna(df2)
   A  B  C
0  1  U  X
1  2  V  Y
2  3  W  Z

数据无序,但 NaN 被替换。

我希望输出是一个如下所示的数据框:

df3
   A  B  C  D
0  1  V  X  8
1  2  W  Y  9
2  3  U  Z  7

标签: pythonpandasdataframe

解决方案


d = dict(zip(df2.A,df2.B))
df1["B"] = df1["A"].map(d)
del df2["B"]
df1.merge(df2,how='left',on='A',sort=True)

推荐阅读