Python学习笔记·第24天:Pandas数据清洗——缺失值、重复值与透视表实战

发布时间:2026/6/30 2:28:22
Python学习笔记·第24天:Pandas数据清洗——缺失值、重复值与透视表实战 一、处理异常值在实际数据中有些值可能明显不合理比如交易额负数、极大极小值需要识别并替换。1.1 查看异常数据# 交易额低于200的数据df[df[交易额]200]# 交易额高于3000的数据df[df[交易额]3000]# 低于200或高于3000的数据df[(df[交易额]200)|(df[交易额]3000)]1.2 替换异常值# 将低于200的交易额替换为200df.loc[df[交易额]200,交易额]200# 将高于3000的交易额替换为3000df.loc[df[交易额]3000,交易额]3000# 上浮50%后仍低于200的数据先做调整再判断df.loc[df[交易额]200,交易额]df[df[交易额]200][交易额].map(lambdanum:num*1.5)大白话先用条件把异常数据找出来再用df.loc[条件, 列名] 新值替换掉。二、处理缺失值2.1 查看缺失值# 数据总行数len(df)# 丢弃缺失值后的行数len(df.dropna())# 查看某列缺失的数据df[df[交易额].isnull()]2.2 填补缺失值# 方法1用固定值填充dffdeepcopy(df)dff.loc[dff[交易额].isnull(),交易额]1000# 方法2用每个人的均值填充dffdeepcopy(df)foriindff[dff[交易额].isnull()].index:dff.loc[i,交易额]round(dff.loc[dff[姓名]dff.loc[i,姓名],交易额].mean())# 方法3用整体均值的80%填充df.fillna({交易额:round(df[交易额].mean()*0.8)},inplaceTrue)缺失值处理三方法对比方法适用场景固定值填充知道缺失值的合理默认值分组均值填充不同类别数据差异大用同类均值更合理整体均值填充数据分布均匀无明显类别差异关键参数dropna(howany)只要某行有缺失就丢弃dropna(howall)某行全部缺失才丢弃fillna(methodffill)用前一个有效值填充fillna(methodbfill)用后一个有效值填充三、处理重复值3.1 查找重复值# 查找完全重复的行df[df.duplicated()]# 指定列判断重复保留第一次出现df[df.duplicated(subset[工号,姓名,日期,时段])]# 查看某个员工某个时段的全部数据dffdf[[工号,姓名,日期,时段]]dffdff[dff.duplicated()]3.2 删除重复值# 删除重复行dfdf.drop_duplicates()# 查看去重后的工号与姓名对应关系df[[工号,姓名]].drop_duplicates()关键参数duplicated(keepfirst)第一次出现标记为False重复的标记为Trueduplicated(keepFalse)所有重复的全部标记为Truedrop_duplicates(inplaceTrue)原地删除不返回新DataFrame四、数据差分大白话用当前行减去上一行的值看变化量。# 每天交易额总额的变化情况dffdf.groupby(by日期).sum()[交易额].diff()print(dff.map(lambdanum:f{num:.2f})[:5])# 张三的每天交易总额变化情况df[df[姓名]张三].groupby(by日期).sum()[交易额].diff()[:5]关键参数diff(periods1)当前行减去上一行periods2则是减去上上行diff(axis0)按行纵向差分diff(axis1)按列横向差分五、透视表与交叉表透视表把数据按行和列重新排列像Excel的数据透视表。# 每人每天的交易额总额透视表dffdf.pivot(index姓名,columns日期,values交易额)# 用pivot_table实现功能更强支持聚合df.pivot_table(values交易额,index姓名,columns日期,aggfuncsum,marginsTrue)# 每人在各柜台的上班次数df.pivot_table(values交易额,index姓名,columns柜台,aggfunccount,marginsTrue)pivot vs pivot_tablepivotpivot_table聚合功能不支持支持sum、mean、count等重复数据处理报错自动聚合边界汇总无marginsTrue 显示汇总交叉表特殊的透视表专门用于统计频次。# 每人每天的上班次数pd.crosstab(df[姓名],df[日期],marginsTrue)# 每人在各柜台交易总额pd.crosstab(df[姓名],df[柜台],df[交易额],aggfuncsum)# 每人在各柜台交易额平均值pd.crosstab(df[姓名],df[柜台],df[交易额],aggfuncmean)今日核心总结异常值处理套路筛选 → loc定位 → 替换缺失值处理三方法固定值填充、分组均值填充、整体均值填充。dropna()丢弃fillna()填充。重复值处理duplicated()查重复drop_duplicates()删重复。数据差分diff()看变化量逐行相减。透视表pivot_table()按行列聚合数据支持求和、计数、平均。marginsTrue显示汇总。交叉表crosstab()统计频次和聚合比透视表更简洁。注:已经使用DeepSeek进行整理精简核心内容些许不理解的配合个人笔记进行理解。