Pandas用map映射分类值时出现returning-a-view-versus-a-copy错误及NaN问题
问题原因分析
1. 映射后全为NaN的原因
你之前尝试调整loc、iloc赋值语法没有效果,是因为问题根源并非赋值方式,而是映射规则和原始数据不匹配:你写的map()字典键是1~12的整数,但原始数据month列的取值本身就是'apr'、'aug'这类字符串缩写,键值完全不匹配,找不到对应关系的取值都会被map()转为NaN。
2. SettingWithCopyWarning的原因
这个警告是因为你使用的train_set大概率是从其他DataFrame做切片筛选得到的视图对象,而非独立副本,pandas为了避免你误改原始数据触发该警告。
解决方法
修正映射字典
根据你的需求调整map的字典结构,保证键和原始值完全匹配。如果你的需求是把现有月份缩写转为数字,使用如下代码:
import pandas as pd import numpy as np DATA_URL = 'https://raw.githubusercontent.com/ThamuMnyulwa/bankMarketing/main/bank-additional-full.csv' raw_dataset = pd.read_csv(DATA_URL, sep=';', skipinitialspace=True, index_col=None) data = raw_dataset.copy() # 字典键为原始列的字符串取值,值为你要转换的目标值 month_map = { 'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12 } data['month'] = data['month'].map(month_map)
如果你的需求是把现有缩写转为其他格式(比如全拼、中文月份),修改字典对应的值即可。
消除SettingWithCopyWarning
在创建切片得到的子DataFrame时,显式调用.copy()生成独立副本:
# 示例:筛选训练集时加copy(),之后修改train_set不会触发警告 train_set = raw_dataset[raw_dataset['split'] == 'train'].copy()
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

