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

2024-04-20 13:12:33 发布

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

我想在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

Tags: 文件数据importdataframeasnpmergenan
2条回答

您可以使用:

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

Output:

df3

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

说明:

sort_values根据A列对df2进行排序。你知道吗

reset_index (drop = True)是按正确顺序连接DataFrame所必需的。你知道吗

我使用concatdf1'C'列与df2连接起来,后者的columns现在顺序正确。最后,我使用reindex来重新定位DataFramedf3columns。你知道吗

您可以看到数据帧df2的顺序没有改变,因为我们没有使用inplace = True。你知道吗

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)

相关问题 更多 >