合并不同大小的数据帧,同时覆盖NaN值

时间:2019-08-29 02:21:10

标签: python pandas dataframe

我想用不同大小的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

2 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

您可以使用:

df3=pd.concat([df1['C'],df2[['A','B','D']].sort_values('A').reset_index(drop=True)],axis=1).reindex(columns=['A','B','C','D'])
  

输出:

df3

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

说明:

sort_values根据df2列排序A

reset_index (drop = True)是按正确顺序连接DataFrame的必要条件。

我使用concatdf1的{​​{1}}顺序正确的'C'df2的列连接起来。最后,我使用columns重新定位reindex columns的{​​{1}}。

您可以看到DataFrame DataFrame的顺序没有改变,因为我们没有使用df3