为数据帧的筛选器填充na



我有一个类似于下面的数据帧:

col1    col2    col3    col4
0    101     1000    NaN     NaN
1    102     2000    51      1500
2    103     2500    52      2800
3    104     3600    53      NaN
4    105     2400    NaN     NaN
5    106     3600    54      NaN
6    107     1200    55      1800
7    108     1000    NaN     NaN
8    NaN     NaN     56      1200

现在,我需要用col2中的相应值填充col4中的na值。所以,如果col4是NaN,那么从col2获取值,并将其放入col4中。

然而,这里的问题是,只有当col3有一些值时,我才需要这样做。(过滤数据帧(

若我必须填充NaN值而不考虑过滤器,那个么以下内容将起作用:

df['col4'].fillna(0) # If I need to fill all NaN with zero values
df['col4'].fillna(df['col2']) # if I need to fill the corresponding col2 values in place of NaN

但是,如何做到只有过滤后的数据才能填充na?

也就是说,在上面的例子中,只有行3和5(对应于col3值53和54(应该用来自col2(3600和3600(的值填充。而第0、5和7行的col4应保持NaN。

这将不起作用,因为筛选的列表将是整个列的子集。

df[df['col3'].notnull()]['col4'].fillna(df['col2'],inplace=True) #will not work

由于数据集有200多万行,我们可以在没有循环的情况下做到这一点吗?

尝试通过notna()创建布尔掩码:

cond=df['col3'].notna()

最后通过使用loc访问器和fillna():有条件地传递掩码和填充值

df.loc[cond,'col4']=df.loc[cond,'col4'].fillna(df.loc[cond,'col2'])