Pandas 分组聚合与数据清洗学习笔记
掌握 DataFrame 的选择与筛选后下一步就是回答“不同群体有什么差异”并处理真实数据中的缺失和重复问题。本篇复盘 Pandas 的groupby、agg、pivot_table、缺失值处理与去重形成一套基础的数据清洗与统计流程。一、groupby按组进行统计groupby的核心可以概括为三个步骤拆分split→ 计算apply→ 合并combine。先按某个字段把数据切成不同组再对每组进行统计最后把结果组合起来。import pandas as pd df pd.DataFrame({ Sex: [m, f, m, f], Age: [20, 30, 40, 26], Pclass: [1, 1, 2, 2], Survived: [1, 1, 0, 1], }) print(df.groupby(Sex)[Age].mean())这段代码可以拆成一句话**按Sex分组对每组的Age求平均值。**学习groupby时最好始终先回答两个问题按什么分组对哪一列做什么计算也可以同时使用多个分组键df.groupby([Sex, Pclass])[Survived].mean()对于只有 0 和 1 的字段例如Survived求均值实际上就是计算 1 所占的比例因此可以直接表示生还率。另外groupby默认会把分组键本身为缺失值的记录排除。如果“未知类别”也需要参与统计可以显式设置dropnaFalse。若希望分组字段仍作为普通列而不是结果索引可以使用as_indexFalse这样后续导出或继续合并表格会更方便summary df.groupby(Sex, as_indexFalse)[Age].mean()二、size、count 与常用聚合函数分组统计时size()与count()很容易混淆data pd.DataFrame({ group: [a, a, b], value: [1, None, 2], }) print(data.groupby(group).size()) print(data.groupby(group)[value].count())size()统计每组的总行数包括目标列存在缺失值的行count()统计指定列的非缺失值数量。因此有缺失值时两者可能不同。常用聚合函数还包括sum()、mean()、median()、min()、max()和std()。需要一次计算多个指标时可以使用agg()result data.groupby(group)[value].agg([ mean, median, count ])如果希望结果列名更清楚可以使用命名聚合result df.groupby(Sex).agg( avg_age(Age, mean), sample_size(Age, count), )三、pivot_table把分组结果变成二维表多字段分析时pivot_table可以把一个字段放到行、另一个字段放到列更适合展示交叉统计结果pt pd.pivot_table( df, indexSex, columnsPclass, valuesSurvived, aggfuncmean, )可以把groupby理解为更灵活的分组计算工具而透视表更强调二维展示。需要继续进行复杂计算时常用groupby需要制作“性别 × 舱位”这类汇总表时pivot_table更直观。四、先量化缺失再决定怎么处理真实数据清洗的第一步不是立刻fillna()而是先确认缺失发生在哪里以及缺失比例print(df.isna().sum()) print(df.isna().mean())isnull()与isna()等价。前者统计缺失数量后者配合mean()可以计算各列缺失比例。需要注意Pandas 中多数常用统计函数默认skipnaTrue因此Series.mean()通常会忽略NaN不会像普通算术表达式那样直接得到NaN。但这并不意味着缺失值可以不处理——样本缺失可能改变统计量所代表的人群甚至造成偏差。五、删除还是填充缺失值常用处理方式包括# 删除 Age 缺失的行 clean df.dropna(subset[Age]) # 使用中位数填充 df[Age] df[Age].fillna(df[Age].median())一般来说关键字段缺失且无法恢复时可以考虑删除数值字段需要保留样本时可以结合数据分布使用均值或中位数类别字段可以根据业务使用众数或显式的“Unknown”类别。不要把“缺失率多少就一定删除或填充”当成固定公式。相同的缺失比例在身份证号、年龄和备注字段上的意义完全不同。选择策略时应同时考虑缺失原因、字段重要性、分布特征和后续任务。六、分组填充保留组间差异如果不同群体的数值分布明显不同用全局中位数填充可能掩盖差异可以按组计算中位数后再填df[Age] df.groupby(Pclass)[Age].transform( lambda s: s.fillna(s.median()) )transform()会返回与原 DataFrame 行数相同的 Series因此可以直接赋回原列。这是它与普通聚合结果的重要区别。还要检查填充完成后是否仍存在缺失如果某个分组的Age全部为NaN该组的中位数仍然是NaN分组填充并不能自动解决这一情况。七、重复数据与 drop_duplicates去重前应该先判断“什么叫重复”。可以先统计people pd.DataFrame({ Name: [Alice, Alice, Bob], Age: [20, 21, 30], }) dup_count people.duplicated(subset[Name]).sum()再根据业务规则去重people people.drop_duplicates( subset[Name], keepfirst, )subset决定依据哪些列判断重复keepfirst保留第一条keeplast保留最后一条keepFalse则把所有重复项都标记为重复。这里最大的坑是把“多次出现”等同于“脏数据”。同一个用户可能有多笔真实订单同一个姓名也可能对应不同的人因此必须先确定业务唯一键再决定是否删除。八、推荐的数据清洗与分析流程面对一份新的 CSV可以按照以下顺序操作用shape、head()、dtypes了解数据结构使用isna().sum()和isna().mean()量化缺失使用duplicated()检查可能的重复记录根据业务含义选择删除、全局填充或分组填充清洗后再次检查缺失值、重复数和数据范围使用groupby或pivot_table完成分组统计对关键结论检查样本量避免只比较均值而忽略组大小。最后一点尤其重要。例如两个分组均值差异很大但其中一组只有少量样本时不能只根据均值直接下结论。九、常见错误总结常见错误正确思路混淆size()与count()前者看总行数后者不计目标列缺失值未检查缺失就直接填充先统计数量、比例与分布所有数值缺失都填 0根据字段含义选择策略只用全局统计量填充组间差异明显时考虑分组填充看到重复就直接删除先明确业务唯一键只比较分组均值同时检查样本量和缺失情况总结Pandas 分组与清洗可以归纳为两个核心问题数据应该怎样分组统计以及数据质量问题应该怎样处理。groupby负责“按什么切、对什么算”agg负责一次得到多个指标pivot_table负责二维汇总isna、fillna、dropna和drop_duplicates则构成基础清洗工具箱。真正重要的并不是记住函数名而是每一步都能说明处理理由并在清洗前后检查数据规模、缺失情况和统计结果是否符合预期。

相关新闻