3、数据准备基础:Pandas读取CSV/Excel、数据概览与缺失值初步处理
在分群评分沙盘项目中,数据准备是后续所有分析与建模的基石。本章将系统讲解如何使用 Pandas 库完成数据加载、初步探查以及缺失值的基础处理,确保数据进入分析流程前具备良好的质量与结构。
3.1 Pandas 读取 CSV 与 Excel 文件
Pandas 提供了 read_csv() 和 read_excel() 两个核心函数,分别用于读取逗号分隔值文件和 Excel 工作簿。以下为常用参数说明:
| 函数 | 参数 | 说明 | 示例值 |
|---|---|---|---|
read_csv() | filepath_or_buffer | 文件路径或 URL | './data/scores.csv' |
sep | 分隔符,默认逗号 | ',' 或 '\t' | |
encoding | 文件编码 | 'utf-8' 或 'gbk' | |
header | 列名所在行号,默认 0 | 0 或 None | |
read_excel() | io | 文件路径或类文件对象 | './data/scores.xlsx' |
sheet_name | 工作表名称或索引 | 'Sheet1' 或 0 | |
dtype | 指定列数据类型 | {'user_id': str} |
编码提示: 当读取包含中文的 CSV 文件时,若遇到
UnicodeDecodeError,可尝试将 encoding 参数改为 'gbk' 或 'gb18030'。
import pandas as pd
# 读取 CSV 文件
df_csv = pd.read_csv('scores.csv', encoding='utf-8')
# 读取 Excel 文件
df_excel = pd.read_excel('scores.xlsx', sheet_name='用户评分')
print('CSV 数据加载完成,形状:', df_csv.shape)
print('Excel 数据加载完成,形状:', df_excel.shape)
3.2 数据概览:head / info / describe
加载数据后,应第一时间通过三个核心方法了解数据全貌:
head(n):预览前 n 行(默认 5 行),快速检查列名与数据样例。info():输出每列的非空计数、数据类型及内存占用,是发现缺失值与类型异常的利器。describe():对数值列生成描述性统计(计数、均值、标准差、四分位数等)。
# 预览前 5 行
print('前 5 行数据:')
print(df_csv.head())
# 数据信息概览
print('\n数据信息:')
df_csv.info()
# 数值列统计描述
print('\n描述性统计:')
print(df_csv.describe())
实战要点: 在分群评分场景中,
info() 能快速暴露哪些评分列存在缺失,describe() 则帮助判断评分分布是否偏斜,为后续分群提供依据。
3.3 缺失值初步处理
缺失值在真实数据中几乎不可避免。Pandas 使用 NaN(Not a Number)标记缺失。初步处理通常包含以下步骤:
- 检测缺失:
isnull()或isna()返回布尔 DataFrame,sum()汇总每列缺失数量。 - 可视化缺失比例:计算缺失率,辅助决策处理策略。
- 基础处理:删除缺失行(
dropna())或填充缺失值(fillna())。
# 检测缺失值
missing_count = df_csv.isnull().sum()
missing_ratio = missing_count / len(df_csv) * 100
print('每列缺失数量:')
print(missing_count)
print('\n每列缺失比例(%):')
print(missing_ratio)
# 删除包含缺失的行(谨慎使用)
df_clean = df_csv.dropna()
# 用均值填充数值列缺失
df_filled = df_csv.fillna(df_csv.mean(numeric_only=True))
注意: 直接使用
dropna() 可能丢失大量样本,尤其在评分数据稀疏时。建议先评估缺失比例,再选择填充或插值策略。
3.4 数据准备流程总览
以下 SVG 图展示了从文件读取到缺失值初步处理的完整数据准备链路:
3.5 常见问题与避坑指南
| 问题场景 | 可能原因 | 解决方案 |
|---|---|---|
| 读取 CSV 报编码错误 | 文件编码与指定编码不匹配 | 尝试 encoding='gbk' 或 encoding='utf-8-sig' |
| Excel 读取后数值列显示为对象类型 | 单元格包含混合类型或空值 | 使用 dtype 参数强制指定类型,或事后 pd.to_numeric() |
info() 显示某列非空数远少于行数 | 该列存在大量缺失 | 评估缺失比例,决定填充或删除 |
describe() 只显示部分列 | 非数值列被自动排除 | 使用 include='all' 查看所有列统计 |
最佳实践: 在分群评分沙盘中,建议先使用
info() 确认每列数据类型是否正确,再用 describe() 观察评分分布,最后根据缺失比例决定处理方式。切勿跳过概览步骤直接建模。