使用匹配条件更新Python Pandas数据框中的缺失值

时间:2017-07-04 17:01:45

标签: python pandas match

我有一个包含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.Adf1.B==df2.B

任何好的解决方案?

2 个答案:

答案 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