一、处理异常值
在实际数据中,有些值可能明显不合理(比如交易额负数、极大极小值),需要识别并替换。
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,重复的标记为Trueduplicated(keep=False):所有重复的全部标记为Truedrop_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:
| pivot | pivot_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')今日核心总结
异常值处理套路:
筛选 → loc定位 → 替换缺失值处理三方法:固定值填充、分组均值填充、整体均值填充。
dropna()丢弃,fillna()填充。重复值处理:
duplicated()查重复,drop_duplicates()删重复。数据差分:
diff()看变化量,逐行相减。透视表:
pivot_table()按行列聚合数据,支持求和、计数、平均。margins=True显示汇总。交叉表:
crosstab()统计频次和聚合,比透视表更简洁。
注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。