我有两个这样的数据框:
A B
a 1 10
b 2 11
c 3 12
d 4 13
A B
a 11 NaN
b NaN NaN
c NaN 20
d 16 30
它们具有相同的列名和索引。我的目标是将NAs
中的df2
替换为df1
的值。目前,我这样做:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'A': range(1, 5), 'B': range(10, 14)}, index=list('abcd'))
df2 = pd.DataFrame({'A': [11, np.nan, np.nan, 16], 'B': [np.nan, np.nan, 20, 30]}, index=list('abcd'))
def repl_na(s, d):
s[s.isnull().values] = d[s.isnull().values][s.name]
return s
df2.apply(repl_na, args=(df1, ))
给了我想要的输出:
A B
a 11 10
b 2 11
c 3 20
d 16 30
现在我的问题是,如果数据帧的索引不同(列名仍然相同,并且列具有相同的长度),如何实现这一点。所以我会df2
这样(df1
不变):
A B
0 11 NaN
1 NaN NaN
2 NaN 20
3 16 30
然后上面的代码不再起作用,因为数据帧的索引是不同的。有人可以告诉我该怎么行
s[s.isnull().values] = d[s.isnull().values][s.name]
必须修改才能获得与上面相同的结果?
答案 0 :(得分:3)
您可以暂时将df1
上的索引更改为df2
,将combine_first
与df2
暂时更改;
df2.combine_first(df1.set_index(df2.index))
A B
1 11 10
2 2 11
3 3 20
4 16 30