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

构建电影票房预测线性回归模型:清理NaN后数据全空的原因及解决

问题:清理NaN后数据集全部行被删除的原因与解决方法

问题背景

我正在用Pandas与Numpy构建线性回归模型预测电影票房,操作流程如下:

  1. 导入数据集并删除不需要的列
  2. 尝试将所有列转换为float64类型,转换过程中部分列产生NaN值
  3. 筛选无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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:00:27