我有两个这样的数据框:

   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


我的问题是,如果数据帧的索引不同(列名称仍然相同,并且列具有相同的长度),那么如何实现此目的。所以我会有这样的df2df1不变):

    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/

10-12 18:12
查看更多