You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一列值替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:31:39