我有两个这样的数据框:
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]
必须修改才能获得与上述相同的结果?
最佳答案
您可以暂时将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
关于python - 使用Apply将列传递给函数时,数据框不会更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35898269/