Pandas入门指南:用生活化的厨房比喻讲解数据处理,清晰呈现企业刚需的数据清洗实操方法,帮助新手快速上手。

张开发
2026/4/9 22:27:15 15 分钟阅读

分享文章

Pandas入门指南:用生活化的厨房比喻讲解数据处理,清晰呈现企业刚需的数据清洗实操方法,帮助新手快速上手。
Pandas 从零到精通用“数据厨房”比喻贯穿的全栈式实战教程适用对象刚学完 Python 基础语法变量、循环、函数、列表/字典的初学者核心理念把数据分析过程类比为厨房烹饪全流程——安装是备厨具Series/DataFrame 是食材形态读写是采购清洗是择菜筛选是切配分组是分堆聚合是调味合并是拼盘可视化是摆盘。所有抽象概念均有生活化映射。一、厨房筹备安装与导入5分钟上手Pandas 不是 Python 自带的“锅碗瓢盆”需单独安装。就像买新厨具用pip这个“快递平台”下单 # ✅ 推荐国内加速安装清华源3秒完成 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple # ✅ 验证安装成功 python -c import pandas as pd; print(pd.__version__)在代码中导入并起昵称pd约定俗成如叫“老张”比“张建国”更顺口import pandas as pd import numpy as np # 后续处理缺失值必备NaN 的制造者 print(✅ Pandas 厨房已通电厨具就位)比喻强化import pandas as pd就像打开橱柜取出印着“Pandas”logo的智能料理机——它能自动切丝、打浆、称重、计时但你得先插电import。二、认识两大核心厨具Series香肠与 DataFrame菜篮子维度Series一根香肠DataFrame一篮子菜形状一维[值1, 值2, 值3] 索引标签二维行×列类似 Excel 表格比喻一串葡萄每颗有编号、温度计读数序列超市小票商品名、数量、单价、小计四列创建方式pd.Series([数据], index[标签])pd.DataFrame({列名: [数据], ...})▶ 实例1创建“今日体温香肠”Series# 每小时测一次体温时间就是“香肠切片的编号” body_temp pd.Series( data[36.5, 36.8, 37.0, 36.9, 36.7], index[6:00, 9:00, 12:00, 15:00, 18:00] ) print(️ 体温香肠Series) print(body_temp) print(f → 12:00 体温{body_temp[12:00]}°C) # 通过标签索引像喊“第三片香肠”▶ 实例2创建“超市小票菜篮子”DataFrame# 一张真实小票4行3列商品、数量、单价 receipt pd.DataFrame({ 商品: [苹果, 香蕉, 牛奶, 面包], 数量: [2, 5, 1, 3], 单价(元): [5.5, 3.0, 8.0, 12.0] }) print( 超市小票DataFrame) print(receipt) print(f → 总商品种类数{receipt.shape[0]} 种) # shape[0] 行数 商品种类 print(f→ 小票列名{list(receipt.columns)}) # columns 列名 “商品”“数量”“单价”关键洞察DataFrame 的每一列本质就是一个 Seriesreceipt[商品]就是Series([苹果,香蕉,牛奶,面包])。三、采购食材数据读取I/O——支持10种格式Pandas 是“万能采购员”支持从 CSV、Excel、数据库甚至网页直接抓取数据 。数据源代码示例说明CSVdf pd.read_csv(sales.csv)最常用纯文本表格轻量高效Exceldf pd.read_excel(data.xlsx, sheet_nameQ1)支持多工作表sheet_name指定页签SQLdf pd.read_sql(SELECT * FROM users, conn)直连数据库conn是数据库连接对象字典df pd.DataFrame({A: [1,2], B: [3,4]})快速构造测试数据▶ 实战读取一份模拟学生成绩 CSV附文件内容结构假设你有一个students.csv文件内容如下name,math,english,science Alice,85,92,78 Bob,90,88,85 Charlie,76,95,82# ✅ 一行代码采购完成 df pd.read_csv(students.csv) print( 原始成绩单前3行预览) print(df.head(3)) # head(n) 看前n行像快速翻书 # 快速探查数据概况厨房里的“食材质检报告” print(f 数据概况{df.shape[0]} 行 × {df.shape[1]} 列) print( 列类型检查) print(df.dtypes) # 查看每列是数字(int/float)还是文字(object) print( 数值列统计摘要自动计算均值、标准差等) print(df.describe()) # 只对数值列生效⚠️避坑提示中文路径报错用r路径或正斜杠/替代反斜杠\例如pd.read_csv(rC:\data\file.csv)→pd.read_csv(C:/data/file.csv)四、择菜去泥数据清洗Data Cleaning——90% 工作在此真实数据像刚买回的蔬菜有烂叶缺失值、有泥巴异常值、标签不统一格式混乱。清洗是 Pandas 最高频操作 。▶ 步骤1识别“烂叶子”缺失值 NaN# 制造一个含缺失值的 DataFrame模拟录入错误 df_dirty pd.DataFrame({ 姓名: [张三, 李四, 王五, 赵六], 数学: [85, np.nan, 78, 92], # 李四数学缺考 语文: [88, 76, np.nan, 85], # 王五语文缺考 英语: [92, 88, 70, np.nan] # 赵六英语缺考 }) print( 原始脏数据) print(df_dirty) print(f ❌ 缺失值统计 {df_dirty.isnull().sum()}) # 每列有多少个 NaN▶ 步骤2处理烂叶子3种策略策略代码示例适用场景丢弃整行df_clean df_dirty.dropna()缺失极少且该行其他数据无价值填充均值df_clean df_dirty.fillna(df_dirty.mean())数值型数据缺失随机填充众数df_clean df_dirty.fillna(df_dirty.mode().iloc[0])分类型数据如“班级”填“一班”# ✅ 对数值列用均值填充对非数值列用前向填充用上一行值 df_clean df_dirty.copy() df_clean[[数学, 语文, 英语]] df_clean[[数学, 语文, 英语]].fillna( df_clean[[数学, 语文, 英语]].mean().round(1) ) df_clean[姓名] df_clean[姓名].fillna(methodffill) # 姓名用前向填充 print( ✅ 清洗后数据均值填充前向填充) print(df_clean)▶ 步骤3揪出“泥巴”异常值检测用箱线图Boxplot逻辑识别离群点# 计算语文成绩的四分位数 Q1 df_clean[语文].quantile(0.25) Q3 df_clean[语文].quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR outliers df_clean[(df_clean[语文] lower_bound) | (df_clean[语文] upper_bound)] print(f ⚠️ 语文异常值低于{lower_bound:.1f}或高于{upper_bound:.1f}) print(outliers if not outliers.empty else 无异常值)五、切配分装数据筛选与索引最易混淆必须掌握DataFrame 索引是 Pandas 的“灵魂操作”分三大类类型语法说明比喻布尔索引df[df[数学]80]用条件表达式直接筛选行“把所有大于80分的学生挑出来”.loc[]df.loc[行标签, 列标签]用标签名字符串/日期索引“请把‘张三’那行的‘数学’和‘英语’列给我”.iloc[]df.iloc[行位置, 列位置]用整数位置0-based索引“请把第0行、第1列和第2列的数据给我”▶ 实例对比同一需求三种写法# 假设 df_clean 如上我们想提取数学≥85 且 英语≥90 的学生姓名和两科成绩 # ✅ 方法1布尔索引最直观推荐新手 high_scorers df_clean[(df_clean[数学] 85) (df_clean[英语] 90)][[姓名, 数学, 英语]] print( 布尔索引结果) print(high_scorers) # ✅ 方法2.loc —— 先筛选行再选列 mask (df_clean[数学] 85) (df_clean[英语] 90) high_scorers_loc df_clean.loc[mask, [姓名, 数学, 英语]] print( .loc 结果完全一致) print(high_scorers_loc) # ✅ 方法3.iloc —— 需先获取满足条件的行号 row_indices df_clean.index[(df_clean[数学] 85) (df_clean[英语] 90)].tolist() col_indices [0, 1, 3] # 姓名(0), 数学(1), 英语(3) —— 注意列位置 high_scorers_iloc df_clean.iloc[row_indices, col_indices] print( .iloc 结果需手动查位置易错) print(high_scorers_iloc)黄金法则用标签列名、索引名→ 选.loc用数字位置第几行第几列→ 选.iloc用条件过滤→ 选布尔索引最自然六、分堆调味分组聚合GroupBy——数据分析的核心引擎GroupBy 是 Pandas 的“魔法研磨机”把数据按某列如“班级”分堆再对每堆执行计算求和、平均、计数。▶ 语法结构df.groupby(分组列)[目标列].聚合函数()# 扩展成绩单加入班级信息 df_class pd.DataFrame({ 姓名: [张三, 李四, 王五, 赵六, 钱七, 孙八], 班级: [一班, 一班, 一班, 二班, 二班, 二班], 数学: [85, 92, 78, 88, 95, 82], 英语: [92, 88, 70, 85, 90, 87] }) # 按班级分堆计算数学和英语的平均分 class_avg df_class.groupby(班级)[[数学, 英语]].mean().round(1) print( 按班级分组平均分) print(class_avg) # 复杂聚合每班人数、数学最高分、英语最低分 class_summary df_class.groupby(班级).agg({ 数学: [count, max], # 数学列计数、最大值 英语: [min, std] # 英语列最小值、标准差 }).round(2) print( 复杂聚合每班统计) print(class_summary)输出解读数学 英语 count max min std 班级 一班 3 92 70 9.64 二班 3 95 85 2.89→ 一班3人数学最高92二班英语最低85成绩更稳定标准差2.89 9.64。七、拼盘上桌数据合并Merge / Concat——整合多源信息当数据分散在多张表时如“学生基本信息表”“学生成绩表”需合并 。合并方式语法示例场景比喻横向拼接pd.concat([df1, df2], axis1)把两张并排的菜单左菜名右价格贴成一张纵向拼接pd.concat([df1, df2], axis0)把两份销售日报周一、周二叠成一周报表关联查询pd.merge(df_left, df_right, onID)根据“身份证号”把人事表和薪资表连起来▶ 实战合并学生信息与成绩内连接# 表1学生档案含学号、姓名、年级 students_info pd.DataFrame({ 学号: [S001, S002, S003, S004], 姓名: [张三, 李四, 王五, 赵六], 年级: [大一, 大一, 大二, 大二] }) # 表2学生成绩含学号、科目、分数 students_score pd.DataFrame({ 学号: [S001, S001, S002, S003, S004, S004], 科目: [数学, 英语, 数学, 英语, 数学, 英语], 分数: [85, 92, 90, 78, 88, 85] }) # 内连接只保留两个表都有的学号交集 merged pd.merge(students_info, students_score, on学号, howinner) print( 内连接结果4名学生 × 2科 8条记录) print(merged) # 左连接以学生档案为主成绩为空则显示NaN merged_left pd.merge(students_info, students_score, on学号, howleft) print( 左连接结果保留所有学生缺成绩显示NaN) print(merged_left)八、终极实战端到端分析“电商用户行为”用一个完整案例串联全部技能数据来自公开的online_retail.csv可从 Kaggle 下载。# 1️⃣ 采购数据 df pd.read_csv(online_retail.csv, encodinglatin-1) # 2️⃣ 清洗删除空订单、修复数据类型 df df.dropna(subset[CustomerID, InvoiceNo]) df[InvoiceDate] pd.to_datetime(df[InvoiceDate]) df[TotalPrice] df[Quantity] * df[UnitPrice] # 3️⃣ 探索Top 5 高消费客户 top_customers df.groupby(CustomerID)[TotalPrice].sum().sort_values(ascendingFalse).head(5) print( Top 5 客户总消费) print(top_customers) # 4️⃣ 分析每月销售额趋势时间序列 monthly_sales df.set_index(InvoiceDate).resample(M)[TotalPrice].sum() print( 月度销售额2010年) print(monthly_sales[2010]) # 5️⃣ 可视化需 matplotlib import matplotlib.pyplot as plt monthly_sales[2010].plot(title2010年月度销售额, figsize(10,4)) plt.ylabel(销售额 (英镑)) plt.show()✅ 此案例覆盖读取 → 清洗去空、类型转换→ 分组聚合客户消费→ 时间序列resample→ 可视化plot。九、进阶地图从熟练到精通的必经之路阶段关键能力学习资源指引入门Series/DataFrame、读写、清洗、筛选本文全部内容 熟练GroupBy 多级索引、透视表pivot_table、时间序列resamplePandas 官方文档 “10 Minutes to Pandas”精通自定义函数apply、窗口函数rolling、内存优化category、与 SQL/Spark 集成《Python for Data Analysis》第2版专家开发自定义访问器.str,.dt、性能调优query,eval、贡献开源Pandas GitHub Issues PRs十、避坑锦囊新手最常踩的5个雷雷区错误代码正确写法原因链式赋值警告df[df[A]0][B] 1df.loc[df[A]0, B] 1避免SettingWithCopyWarning必须用.loc显式定位修改原地df.drop(columns[A])df.drop(columns[A], inplaceTrue)或df df.drop(...)drop默认返回新 DataFrame不修改原对象布尔运算符df[(df.A1) and (df.B2)]df[(df.A1) (df.B2)]Pythonand/or不能用于数组必须用 /字符串方法df[name].upper()df[name].str.upper()Series 字符串操作必须加.str前缀缺失值比较df[A] np.nandf[A].isnull()np.nan np.nan返回False永远用isnull()结语你的第一道“数据大餐”已完成你已掌握 Pandas 的全工作流备厨具安装→ 认食材Series/DataFrame→ 采购I/O→ 择菜清洗→ 切配筛选→ 分堆GroupBy→ 拼盘Merge→ 上桌分析。下一步行动建议立刻实践用本文代码在 Jupyter Notebook 中逐行运行替换数据把你手机里导出的微信账单CSV、运动步数Excel用本文方法分析挑战升级去 Kaggle 下载Titanic或Iris数据集复现本文所有步骤。数据分析不是记忆语法而是用工具解决真实问题。当你第一次用groupby().mean()发现“周末订单平均金额比工作日高37%”那一刻你已不再是学习者而是数据厨师——而 Pandas就是你手中那把永不生锈的主厨刀。参考来源Python pandas 从入门到实战核心操作全解析Pandas 教程从入门到精通Pandas从入门到精通的超详细教程

更多文章