在机器学习工作流中,“数据决定上限,模型逼近上限”,而 Pandas 作为 Python 数据分析生态的核心库,正是把控数据质量、挖掘数据价值的关键工具。本文作为系列第一篇,将聚焦 Pandas 在机器学习中的基础操作与数据预处理核心能力,结合实际代码案例,从数据加载、探索分析到筛选去重、缺失值处理,帮你搭建从原始数据到有效样本的第一座桥梁。
一、Pandas 基础:机器学习的 “数据容器” 搭建
一切机器学习分析都始于 “数据加载”—— 将外部文件(CSV、Excel 等)转换为 Pandas 可操作的 DataFrame 格式,同时通过基础探索了解数据全貌,为后续处理避开 “数据坑”。
1.1 数据加载:适配不同格式与编码
机器学习中数据源格式多样,Pandas 提供针对性加载函数,需重点关注编码格式(解决中文乱码)和文件路径(避免读取失败)两大问题。
1.1.1 CSV 文件加载(最常用场景)
CSV 是机器学习数据的主流格式,尤其适合存储商品、用户等结构化数据。处理中文数据时,需指定encoding='gbk'(Windows 默认)或utf-8,并通过engine='python'规避编码兼容问题:
import pandas as pd
# 基础加载:处理中文编码
df = pd.read_csv("商品数据.csv", encoding='gbk', engine='python')
# 进阶加载:只读取需要的列(减少内存占用)
df = pd.read_csv("商品数据.csv", usecols=['品牌', '价格', '好评数', '总评价数'])
1.1.2 Excel 文件加载(多 sheet 场景)
当训练集与测试集分开存储在 Excel 不同 sheet(如鸢尾花数据)时,可通过sheet_name指定读取目标:
# 按sheet名称读取(更直观)
train_df = pd.read_excel("鸢尾花数据.xlsx", sheet_name="训练集")
# 按sheet索引读取(0代表第一个sheet)
test_df = pd.read_excel("鸢尾花数据.xlsx", sheet_name=1)
1.1.3 TXT 文件加载(结构化文本数据)
对于datingTestSet2.txt这类空格分隔的文本数据,可通过sep指定分隔符,并用names自定义列名,便于后续分析:
# 读取无表头的TXT文件,指定分隔符和列名
df = pd.read_csv(
"datingTestSet2.txt",
sep=" ", # 空格分隔
header=None, # 无表头
names=['消费能力', '游戏时间占比', '冰淇淋消耗量', '兴趣标签'] # 自定义列名
)
1.2 数据初探:3 行代码摸清数据 “底细”
加载数据后,切忌直接开始处理 —— 需先通过 3 个核心方法快速排查数据质量问题(如数据类型错误、缺失值、异常值),避免后续建模踩坑:
# 1. 查看前5行数据,直观了解列名和数据格式
print("数据前5行:")
print(df.head())
# 2. 查看数据基本信息(行数、列数、数据类型、缺失值)
print("\n数据基本信息:")
print(df.info())
# 关键关注:是否有object类型的数值(如“好评数”误判为字符串)、是否有缺失值(Non-Null Count列)
# 3. 查看数值型特征的统计描述(均值、标准差、最值)
print("\n数值特征统计:")
print(df.describe())
# 辅助判断异常值:如“价格”列最大值远超均值,可能存在极端值
常见问题处理:若df.info()显示 “好评数” 为object类型(而非int),需先转换数据类型:
# 先清理非数值字符(如“万+”),再转换为整数
df['好评数'] = df['好评数'].str.replace('万+', '').astype(int) * 10000
二、Pandas 核心:机器学习数据预处理三板斧
机器学习模型对数据 “整洁度” 要求极高 —— 无效数据、重复样本、缺失值会直接导致模型偏差或报错。Pandas 的数据筛选、去重、缺失值处理功能,正是解决这些问题的核心工具。
2.1 数据筛选:精准定位目标样本
从全量数据中筛选出符合业务需求的样本(如 “高好评商品”“低价用户”),是机器学习 “样本选择” 阶段的关键步骤。Pandas 支持单条件、多条件、字符串匹配等多种筛选方式,覆盖主流场景。
2.1.1 数值型特征筛选(价格、好评数等)
通过比较运算符(> < ==)和逻辑运算符(& 且、| 或)实现精准筛选,需注意每个条件用括号包裹:
# 1. 单条件:筛选好评数>17000的高好评商品
high_praise = df[df['好评数'] > 17000]
# 2. 区间条件:好评数在15000-17000之间(用between更简洁)
mid_praise = df[df['好评数'].between(15000, 17000)] # 等价于 (df['好评数']>=15000) & (df['好评数']<=17000)
# 3. 多条件组合:价格<7000 且 好评数>16000(高性价比商品)
cost_effective = df[(df['价格'] < 7000) & (df['好评数'] > 16000)]
# 4. 多条件或:价格<6000 或 好评数>18000(低价或超高好评商品)
target_samples = df[(df['价格'] < 6000) | (df['好评数'] > 18000)]
2.1.2 字符串特征筛选(品牌、类别等)
对于 “品牌”“商品类别” 等文本特征,用str.contains()实现模糊匹配,支持正则表达式,是筛选特定类别样本的利器:
# 筛选“苹果”品牌商品(na=False:排除缺失值,避免报错)
apple_products = df[df['品牌'].str.contains('苹果', na=False)]
# 扩展:筛选“苹果”或“华为”品牌(正则表达式“|”表示或)
top_brands = df[df['品牌'].str.contains('苹果|华为', na=False)]
# 反向筛选:排除“三星”品牌(~表示非)
non_samsung = df[~df['品牌'].str.contains('三星', na=False)]
2.2 数据去重:避免重复样本干扰模型
重复数据会导致模型对重复样本 “过度学习”,降低泛化能力(如同一用户的重复行为记录会放大该用户的影响)。Pandas 通过duplicated()检测重复、drop_duplicates()删除重复,支持 “全量去重” 和 “按关键列去重”。
2.2.1 重复样本检测
# 1. 全量重复检测:所有列值完全相同的样本(默认保留第一个,标记后续重复为True)
all_dups = df.duplicated()
print(f"全量重复样本数:{all_dups.sum()}")
# 2. 按指定列检测:如“用户ID+购买日期”相同(可能是同一订单重复记录)
user_dups = df.duplicated(['用户ID', '购买日期'])
print(f"用户订单重复样本数:{user_dups.sum()}")
# 3. 查看重复样本详情
duplicate_samples = df[user_dups]
print("\n重复订单样本:")
print(duplicate_samples[['用户ID', '购买日期', '商品名称', '价格']])
2.2.2 重复样本删除
根据业务需求选择 “保留第一个”“保留最后一个” 或 “删除所有重复”,建议用inplace=True直接修改原数据(需确保操作无误):
# 1. 删除全量重复:保留第一个样本
df.drop_duplicates(inplace=True)
# 2. 按指定列删除:保留最后一个样本(适合“最新记录有效”场景)
df.drop_duplicates(['用户ID', '购买日期'], keep='last', inplace=True)
# 3. 验证去重结果
print(f"去重前样本数:{len(df)+user_dups.sum()}")
print(f"去重后样本数:{len(df)}")
2.3 缺失值处理:填补数据 “漏洞”
缺失值是机器学习的常见 “陷阱”—— 若直接输入模型(如 KNN、逻辑回归)会报错,若忽略则会导致样本量减少或模型偏差。Pandas 提供 “删除” 和 “填充” 两种核心方案,需根据缺失率和特征类型选择。
2.3.1 缺失值删除(缺失率低时)
若某列缺失值占比 < 5%,直接删除缺失样本(避免填充引入误差),用subset指定需检查的列:
# 删除“好评数”列有缺失值的样本
df_clean = df.dropna(subset=['好评数'])
# 警告:删除所有列有缺失的样本(慎用!可能导致样本量大幅减少)
# df_clean = df.dropna()
2.3.2 缺失值填充(缺失率高时)
若某列缺失值占比 10%-30%,需用合理值填充:数值型特征用均值 / 中位数(中位数抗异常值能力更强),分类特征用众数(出现次数最多的类别):
# 1. 数值型特征填充:用“价格”列中位数填充缺失值
df['价格'] = df['价格'].fillna(df['价格'].median())
# 2. 分类特征填充:用“品牌”列众数填充(mode()返回Series,取第一个众数)
brand_mode = df['品牌'].mode()[0]
df['品牌'] = df['品牌'].fillna(brand_mode)
# 3. 时间特征填充:用前一个非缺失值填充(适合时间序列数据,如用户浏览记录)
df['浏览时间'] = df['浏览时间'].fillna(method='ffill') # ffill=forward fill(向前填充)
验证填充结果:填充后需确认缺失值已处理完毕:
print("填充后各列缺失值数量:")
print(df.isnull().sum()) # 所有列缺失值应为0
三、实践案例:商品数据预处理全流程
结合上述知识点,以 “商品数据预处理” 为例,完整演示从加载到筛选的全流程:
# 1. 加载数据
df = pd.read_csv("商品数据.csv", encoding='gbk', engine='python', usecols=['品牌', '价格', '好评数', '总评价数'])
# 2. 数据初探与类型修正
print("数据基本信息:")
print(df.info())
# 若“好评数”为object类型,转换为int
if df['好评数'].dtype == 'object':
df['好评数'] = df['好评数'].astype(int)
# 3. 缺失值处理
df['价格'] = df['价格'].fillna(df['价格'].median())
df['好评数'] = df['好评数'].fillna(df['好评数'].mean())
# 4. 去重
df.drop_duplicates(inplace=True)
# 5. 筛选目标样本(高性价比商品:价格<7000且好评率>0.9)
df['好评率'] = df['好评数'] / df['总评价数'] # 新增好评率特征
high_value = df[(df['价格'] < 7000) & (df['好评率'] > 0.9)]
# 6. 输出结果
print(f"\n高性价比商品数量:{len(high_value)}")
print("\n高性价比商品TOP10:")
print(high_value[['品牌', '价格', '好评数', '好评率']].head(10))
:Pandas 数据处理基础与预处理核心应用&spm=1001.2101.3001.5002&articleId=151402366&d=1&t=3&u=a8e0122890de4d399fa5fc3f042edd5e)
1096

被折叠的 条评论
为什么被折叠?



