为数据框的过滤器填写 na
Fill na for a filter of dataframe
我有一个类似于下面的数据框:
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'])
我有一个类似于下面的数据框:
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'])