基于另一列值替换DataFrame中hits列空值的技术求助
问题解决:根据converted列值替换hits列的空值
需求说明
现有一个包含两列的DataFrame:
hits列:包含数值和NaN空值converted列:值为0或1
需要实现:
- 当
converted值为1且对应hits为NaN时,将hits替换为9 - 当
converted值为0且对应hits为NaN时,将hits替换为6 - 非NaN的
hits值保持不变
原代码问题分析
你尝试的lambda写法存在以下错误:
- 访问当前行数据时误用了
df['converted'],axis=1模式下apply的参数是单一行数据,应使用row['converted'] - 判断NaN不能用
== 'nan',字符串'nan'和pandas的NaN不是同一概念,需用pd.isna()判断 - 逻辑与操作
&未加括号,单元素判断更适合用and - 未保留原
hits的非空值,直接强制替换为6或9
正确解决方案
方案1:修正后的apply写法
适合小数据集,逻辑直观:
import pandas as pd df['hits'] = df.apply( lambda row: 9 if row['converted'] == 1 and pd.isna(row['hits']) else 6 if row['converted'] == 0 and pd.isna(row['hits']) else row['hits'], axis=1 )
方案2:矢量化操作(推荐,效率更高)
pandas矢量化操作避免逐行循环,适合大数据集:
import numpy as np import pandas as pd # 方法A:嵌套np.where df['hits'] = np.where( pd.isna(df['hits']), np.where(df['converted'] == 1, 9, 6), df['hits'] ) # 方法B:分条件fillna # 先处理converted=1的空值 df.loc[df['converted'] == 1, 'hits'] = df.loc[df['converted'] == 1, 'hits'].fillna(9) # 再处理converted=0的空值 df.loc[df['converted'] == 0, 'hits'] = df.loc[df['converted'] == 0, 'hits'].fillna(6)
内容的提问来源于stack exchange,提问作者mouhamad
相关产品推荐
相关产品推荐

