我想用不同大小的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
答案 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
的必要条件。
我使用concat
将df1
的{{1}}顺序正确的'C'
与df2
的列连接起来。最后,我使用columns
重新定位reindex
columns
的{{1}}。
您可以看到DataFrame DataFrame
的顺序没有改变,因为我们没有使用df3
。