Python 数据分析 07:数据清洗 ------ 我的思路自述
目标:把原始表里的缺失值、重复值、异常值、格式问题逐一收拾干净。
先上代码
import pandas as pd
pd.set_option('display.min_rows', 30) # 默认显示10行,调成30行方便核对
1. 读取数据
df = pd.read_csv('data/sales.csv')
var1 = df
2.1 缺失值处理
var2 = df.isnull() # 查找哪些单元格缺失
var3 = df.dropna() # 删除含缺失值的行
var4 = df.dropna(axis=1) # 删除含缺失值的列
var5 = df.fillna('上海') # 用指定值填充
var6 = df.ffill() # 用上一行填充
var7 = df.bfill() # 用下一行填充
2.2 重复值处理
var8 = df.duplicated() # 所有列都相同才算重复
var9 = df.duplicated(subset='订单号') # 指定列重复即算重复
var11 = df.drop_duplicates(subset='订单号', keep='first') # 按订单号去重,保留第一条
2.3 异常值处理
var12 = dfdf\['单价' < 0] # 查看单价为负的异常行
var13 = df.drop(dfdf\['单价' < 0].index) # 删除这些异常行
df'单价' = df'单价'.abs() # 或修复:取绝对值把负数掰正
2.4 数据格式处理
方法一:仅改单一具体值,不推荐
df'订单日期' = df'订单日期'.replace('2025/06/02', '2025-06-02')
方法二:整列统一替换,推荐
df'订单日期' = df'订单日期'.str.replace('/', '-')
df
我的思路:真实数据很脏,清洗就是"四类体检"
过滤是"挑好的",清洗是"治病的"。我按四种脏数据对症下药,每类都是先查后治。
第一类·缺失值。 先 df.isnull() 看哪儿有空。治法分两派:删或填。dropna() 默认删含空值的整行,加 axis=1 变删列------这里我差点翻车,drop 和 dropna 是两个东西,删缺失值得用 dropna(df.drop(axis=1) 不给列名会直接报错)。填则是 fillna('上海') 统一填指定值,或 ffill() 用上一行、bfill() 用下一行填。
第二类·重复值。 duplicated() 默认要所有列都一模一样才算重,我常用 subset=['订单号'] 只按某列判重。治用 drop_duplicates(subset=['订单号'], keep='first'),keep 决定留第一条、留最后一条还是全不留。
第三类·异常值。 单价出现负数明显不对,df[df['单价'] < 0] 先揪出来看。处理两条路:删------df.drop(df[...].index) 先筛坏行再按索引 drop;修------.abs() 取绝对值把负数掰正,数据量不丢。
第四类·格式。 日期有人写斜杠有人写横杠。replace('2025/06/02',...) 只能改这一个具体值、不通用;正解是 str.replace('/','-') 整列一次性替换,这才是批量清洗该用的。