构建电影票房预测线性回归模型:清理NaN后数据全空的原因及解决
问题:清理NaN后数据集全部行被删除的原因与解决方法
问题背景
我正在用Pandas与Numpy构建线性回归模型预测电影票房,操作流程如下:
- 导入数据集并删除不需要的列
- 尝试将所有列转换为
float64类型,转换过程中部分列产生NaN值 - 筛选无NaN的行后,数据集变为
(0, 13),所有行被删除
原处理代码
import pandas as pd import numpy as np import sklearn df1 = pd.read_csv("sample_data/imdb_top_1000.csv",header = 0) moviedata=df1.drop(["Poster_Link","Released_Year","Overview"], axis = 1) moviedata['Runtime'] = moviedata['Runtime'].str.extract('(\d+)\s*min', expand=False) # 尝试将所有列转为数值型 moviedata['Series_Title'] = pd.to_numeric(moviedata['Series_Title'], errors='coerce') moviedata['Certificate'] = pd.to_numeric(moviedata['Certificate'], errors='coerce') moviedata['Runtime'] = pd.to_numeric(moviedata['Runtime'], errors='coerce') moviedata['Genre'] = pd.to_numeric(moviedata['Genre'], errors='coerce') moviedata['IMDB_Rating'] = pd.to_numeric(moviedata['IMDB_Rating'], errors='coerce') moviedata['Meta_score'] = pd.to_numeric(moviedata['Meta_score'], errors='coerce') moviedata['Director'] = pd.to_numeric(moviedata['Director'], errors='coerce') moviedata['Star1'] = pd.to_numeric(moviedata['Star1'], errors='coerce') moviedata['Star2'] = pd.to_numeric(moviedata['Star2'], errors='coerce') moviedata['Star3'] = pd.to_numeric(moviedata['Star3'], errors='coerce') moviedata['Star4'] = pd.to_numeric(moviedata['Star4'], errors='coerce') moviedata['No_of_Votes'] = moviedata['No_of_Votes'].astype(float) moviedata['Gross'] = pd.to_numeric(moviedata['Gross'], errors='coerce') print('\nShape of data :',moviedata.shape) # 输出:(1000, 13)
NaN清理代码及结果
moviedata = moviedata[~(np.isnan(moviedata).any(axis = 1))] print('\nShape of data :',moviedata.shape) # 输出:(0, 13)
原因分析
核心问题是错误地将文本/类别型特征强行转换为数值类型:
Series_Title(电影名)、Certificate(分级)、Genre(类型)、Director(导演)、Star1-Star4(主演)这些列本质是文本或类别数据,无法直接转换为数值。- 使用
pd.to_numeric(..., errors='coerce')时,所有无法转换的文本都会被强制转为NaN,导致每一行都存在多个NaN值。 - 后续用
np.isnan(moviedata).any(axis=1)判断时,所有行都被标记为包含NaN,取反后自然没有符合条件的行留下。
解决方法
1. 区分特征类型,针对性处理
先明确两类特征的划分:
- 数值型特征:
Runtime、IMDB_Rating、Meta_score、No_of_Votes、Gross - 类别型特征:
Series_Title、Certificate、Genre、Director、Star1-Star4
2. 处理数值型特征的NaN
对于数值型缺失值,优先用中位数填充(避免均值受极端值影响):
numeric_cols = ['Runtime', 'IMDB_Rating', 'Meta_score', 'No_of_Votes', 'Gross'] moviedata[numeric_cols] = moviedata[numeric_cols].fillna(moviedata[numeric_cols].median())
3. 处理类别型特征的NaN与编码
类别型特征不能直接转数值,需先填充缺失值再做编码(独热编码适合线性回归模型):
categorical_cols = ['Series_Title', 'Certificate', 'Genre', 'Director', 'Star1', 'Star2', 'Star3', 'Star4'] # 用众数填充类别型缺失值 for col in categorical_cols: moviedata[col] = moviedata[col].fillna(moviedata[col].mode()[0]) # 独热编码转换类别特征 moviedata = pd.get_dummies(moviedata, columns=categorical_cols, drop_first=True)
4. 验证处理结果
此时再查看数据集形状,不会出现全量删除的情况:
print('\nShape of data after processing:', moviedata.shape)
内容的提问来源于stack exchange,提问作者Archit Chawla
相关产品推荐
相关产品推荐

