Python DataFrame替换"?"为NaN未生效,求正确处理方法
问题分析与解决办法
你的问题其实出在两个关键地方:没有真正修改原DataFrame,以及把"?"替换成了字符串版的"NaN"而非pandas识别的缺失值。咱们一步步来解决:
1. 为什么原来的代码没生效?
- 首先,
data.replace('?','NaN')默认会返回一个修改后的新DataFrame,但你没有把这个新对象赋值回data,也没加inplace=True参数,所以原数据完全没变化,自然还能看到"?"。 - 其次,就算你赋值了,这里的
'NaN'是普通字符串,不是pandas/numpy用来标记缺失值的np.nan。fillna()只会处理真正的缺失值(比如np.nan、pd.NA),字符串"NaN"会被当成普通数据保留,而且你的price还是object类型,调用max()时会按字符串规则比较,这些异常值自然会存在。
2. 正确的处理步骤
步骤1:替换"?"为真正的缺失值
先导入numpy(我们需要用np.nan),然后把所有"?"替换成np.nan,同时确保修改原DataFrame:
import numpy as np import pandas as pd # 方式一:赋值回原变量(推荐,避免原地修改的潜在问题) data = data.replace('?', np.nan) # 方式二:原地修改(直接改原数据) # data.replace('?', np.nan, inplace=True)
如果只想替换特定字段(比如只处理price),可以单独操作:
data['price'] = data['price'].replace('?', np.nan)
步骤2:将price转为数值类型
因为原来的price是object类型(包含字符串),必须转成数值类型才能正常使用max()、mean()这类数值方法。用pd.to_numeric,并通过errors='coerce'把无法转为数值的内容(比如漏网的异常字符串)也转为np.nan:
data['price'] = pd.to_numeric(data['price'], errors='coerce')
步骤3:填充缺失值(按需选择)
现在可以用fillna()处理缺失值了,比如用均值填充:
# 用price列的均值填充缺失值 data['price'] = data['price'].fillna(data['price'].mean()) # 或者用中位数、特定值填充,比如: # data['price'] = data['price'].fillna(data['price'].median()) # data['price'] = data['price'].fillna(0)
步骤4:验证结果
现在再调用max()就正常了:
print(data['price'].max())
内容的提问来源于stack exchange,提问作者Sonia
相关产品推荐
相关产品推荐

