Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为数据帧的筛选器填充na_Python_Pandas_Dataframe_Fillna - Fatal编程技术网

Python 为数据帧的筛选器填充na

Python 为数据帧的筛选器填充na,python,pandas,dataframe,fillna,Python,Pandas,Dataframe,Fillna,我有一个类似于下面的数据帧: 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

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

     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()
有条件地传递掩码和填充值:


谢谢通过任何更改,这是否要求索引为单数?我的意思是,如果索引是多索引,它会工作吗?@满足它也会在多索引中工作……顺便说一句,如果这个答案解决了您的查询,那么尝试接受答案……Thnx:)太好了!谢谢你,伙计!如果你喜欢解决这个问题,请考虑对问题进行投票。
df.loc[cond,'col4']=df.loc[cond,'col4'].fillna(df.loc[cond,'col2'])