我有一个包含3列(A,B,C)的数据帧df1
,NaN代表缺少的值
A B C
1 2 NaN
2 1 2.3
2 3 2.5
我的数据框df2
有3列(A,B,D)
A B D
1 2 2
2 1 2
2 3 4
预期输出为
A B C
1 2 2
2 1 2.3
2 3 2.5
我希望{C}中的值df1
完整,如果没有丢失,则替换为D中的相应值,其他两列值相等,即df1.A==df2.A
和df1.B==df2.B
任何好的解决方案?
答案 0 :(得分:1)
一种方法是使用A列和B列作为索引。如果你使用fillna,那么pandas将对齐索引并给出正确的结果:
df1.set_index(['A', 'B'])['C'].fillna(df2.set_index(['A', 'B'])['D']).reset_index()
Out:
A B C
0 1 2 2.0
1 2 1 2.3
2 2 3 2.5
答案 1 :(得分:1)
IIUC:
In [100]: df['C'] = np.where((np.isnan(df.C))&(df.A==df1.A)&(df.B==df1.B),df1.D,df.C)
In [101]: df
Out[101]:
A B C
0 1.0 2.0 2.0
1 2.0 1.0 2.3
2 2.3 1.2 2.5
比较时 np.where
更快:
In [102]: %timeit df['C'] = np.where((np.isnan(df.C))&(df.A==df1.A)&(df.B==df1.B),df1.D,df.C)
1000 loops, best of 3: 1.3 ms per loop
In [103]: %timeit df.set_index(['A', 'B'])['C'].fillna(df1.set_index(['A', 'B'])['D']).reset_index()
100 loops, best of 3: 5.92 ms per loop