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

Pandas用字典随机替换列NaN值失败,求原因及解决方法

DataFrame替换NaN无效果的原因及解决方法

原始数据与需求

你的原始数据定义如下:

import numpy as np
import pandas as pd
import random

dictonary_of_jobs = {
    'Tax Accountant': ['Health', 'Financial Services', 'Property', 'IT'],
    'Office Assistant': ['Financial Services', 'Property', 'Manufacturing']
}

data = [['Tax Accountant', np.nan], ['Office Assistant', np.nan], ['Tax Accountant', np.nan]]
  
df = pd.DataFrame(data, columns=['job_title', 'job_category'])

需求是:根据job_title从字典中随机选取对应行业类别,替换job_category列的NaN值,但你尝试的代码没有生效。

你的代码错误点

你写的循环代码存在三个核心问题:

  • 索引错误:zip(df['job_title'], df['job_category'])取出的z是job_category的当前值(全为NaN),不是行的索引。用df.at[z,'job_category']根本定位不到要修改的行,因为DataFrame的索引不是NaN。
  • 操作列错误:df['job_title'].replace(z, random.choice(y))修改的是job_title列,而不是目标的job_category列,完全偏离需求。
  • 无原地修改:replace方法默认返回新的Series,不会直接修改原DataFrame,就算列选对了也不会生效。

正确实现方法

方法1:用apply高效处理(推荐)

利用apply逐行处理job_title,直接赋值给job_category列:

df['job_category'] = df['job_title'].apply(
    lambda x: random.choice(dictonary_of_jobs[x]) if x in dictonary_of_jobs else np.nan
)

方法2:正确的循环写法

如果习惯用循环,要遍历行索引和行数据,精准定位修改:

for idx, row in df.iterrows():
    job_title = row['job_title']
    if job_title in dictonary_of_jobs:
        df.at[idx, 'job_category'] = random.choice(dictonary_of_jobs[job_title])

运行后job_category列的NaN会被替换成字典中随机选取的行业类别。

内容的提问来源于stack exchange,提问作者Laura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:15:35