使用apply将列传递给函数时,不会更新Dataframe

时间:2016-03-09 17:17:23

标签: python pandas dataframe apply

我有两个这样的数据框:

   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]
必须修改

才能获得与上面相同的结果?

1 个答案:

答案 0 :(得分:3)

您可以暂时将df1上的索引更改为df2,将combine_firstdf2暂时更改;

df2.combine_first(df1.set_index(df2.index))

    A   B
1  11  10
2   2  11
3   3  20
4  16  30