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
相关产品推荐
相关产品推荐

