使用 apply 将列传递给函数时,数据框不会更新
Dataframe is not updated when columns are passed to function using 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
它们具有相同的列名和索引。我的目标是用 df1
的值替换 df2
中的 NAs
。目前,我这样做是这样的:
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
我有两个这样的数据框:
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
它们具有相同的列名和索引。我的目标是用 df1
的值替换 df2
中的 NAs
。目前,我这样做是这样的:
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