Python学习笔记·第24天:Pandas数据清洗——缺失值、重复值与透视表实战
2026/6/30 2:28:17 网站建设 项目流程

一、处理异常值

在实际数据中,有些值可能明显不合理(比如交易额负数、极大极小值),需要识别并替换。

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:用固定值填充dff=deepcopy(df)dff.loc[dff['交易额'].isnull(),'交易额']=1000# 方法2:用每个人的均值填充dff=deepcopy(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)},inplace=True)

缺失值处理三方法对比

方法适用场景
固定值填充知道缺失值的合理默认值
分组均值填充不同类别数据差异大,用同类均值更合理
整体均值填充数据分布均匀,无明显类别差异

关键参数

  • dropna(how='any'):只要某行有缺失就丢弃
  • dropna(how='all'):某行全部缺失才丢弃
  • fillna(method='ffill'):用前一个有效值填充
  • fillna(method='bfill'):用后一个有效值填充

三、处理重复值

3.1 查找重复值

# 查找完全重复的行df[df.duplicated()]# 指定列判断重复(保留第一次出现)df[df.duplicated(subset=['工号','姓名','日期','时段'])]# 查看某个员工某个时段的全部数据dff=df[['工号','姓名','日期','时段']]dff=dff[dff.duplicated()]

3.2 删除重复值

# 删除重复行df=df.drop_duplicates()# 查看去重后的工号与姓名对应关系df[['工号','姓名']].drop_duplicates()

关键参数

  • duplicated(keep='first'):第一次出现标记为False,重复的标记为True
  • duplicated(keep=False):所有重复的全部标记为True
  • drop_duplicates(inplace=True):原地删除,不返回新DataFrame

四、数据差分

大白话:用当前行减去上一行的值,看变化量。

# 每天交易额总额的变化情况dff=df.groupby(by='日期').sum()['交易额'].diff()print(dff.map(lambdanum:f'{num:.2f}')[:5])# 张三的每天交易总额变化情况df[df['姓名']=='张三'].groupby(by='日期').sum()['交易额'].diff()[:5]

关键参数

  • diff(periods=1):当前行减去上一行(periods=2则是减去上上行)
  • diff(axis=0):按行纵向差分
  • diff(axis=1):按列横向差分

五、透视表与交叉表

透视表:把数据按行和列重新排列,像Excel的数据透视表。

# 每人每天的交易额总额(透视表)dff=df.pivot(index='姓名',columns='日期',values='交易额')# 用pivot_table实现(功能更强,支持聚合)df.pivot_table(values='交易额',index='姓名',columns='日期',aggfunc='sum',margins=True)# 每人在各柜台的上班次数df.pivot_table(values='交易额',index='姓名',columns='柜台',aggfunc='count',margins=True)

pivot vs pivot_table

pivotpivot_table
聚合功能不支持支持(sum、mean、count等)
重复数据处理报错自动聚合
边界汇总margins=True 显示汇总

交叉表:特殊的透视表,专门用于统计频次。

# 每人每天的上班次数pd.crosstab(df['姓名'],df['日期'],margins=True)# 每人在各柜台交易总额pd.crosstab(df['姓名'],df['柜台'],df['交易额'],aggfunc='sum')# 每人在各柜台交易额平均值pd.crosstab(df['姓名'],df['柜台'],df['交易额'],aggfunc='mean')

今日核心总结

  1. 异常值处理套路筛选 → loc定位 → 替换

  2. 缺失值处理三方法:固定值填充、分组均值填充、整体均值填充。dropna()丢弃,fillna()填充。

  3. 重复值处理duplicated()查重复,drop_duplicates()删重复。

  4. 数据差分diff()看变化量,逐行相减。

  5. 透视表pivot_table()按行列聚合数据,支持求和、计数、平均。margins=True显示汇总。

  6. 交叉表crosstab()统计频次和聚合,比透视表更简洁。

注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询