Python pandas数据清洗去重去空实战
用pandas的dropna、drop_duplicates、fillna三步处理脏数据,覆盖整行空值、全列空值、重复行、关键字段重复等常见场景。
场景痛点
从业务系统导出的Excel,经常是一堆空行、重复记录、字段缺失混在一起,手动Ctrl+G定位空值、删除重复项,几十列就眼花。pandas三行代码搞定:删空行、去重、补默认值,清洗完的数据再入库或出报表,结果干净稳定。
用到的库
pip install pandas
完整代码
import pandas as pd
from io import StringIO
RAW_CSV = """name,dept,salary,city
张三,技术部,15000,北京
张三,技术部,15000,北京
李四,,12000,上海
王五,技术部,,深圳
赵六,人事部,9000,
,, ,
钱七,市场部,18000,广州
"""
def clean_data():
# 用StringIO模拟读文件,实际用 pd.read_csv("xxx.csv")
df = pd.read_csv(StringIO(RAW_CSV))
print("原始数据:")
print(df)
# 1. 去掉全为空的行(dept全空那种)
df = df.dropna(how="all")
# 2. 去掉整行重复
df = df.drop_duplicates()
# 3. dept为空填"未分配"
df["dept"] = df["dept"].fillna("未分配")
# 4. salary为空填0,并转成数值
df["salary"] = pd.to_numeric(df["salary"], errors="coerce").fillna(0)
# 5. city为空填"未知"
df["city"] = df["city"].fillna("未知")
# 6. 去掉列名前后空格,去字符串值里的空格
df.columns = [c.strip() for c in df.columns]
for col in ["name", "dept", "city"]:
df[col] = df[col].astype(str).str.strip()
print("清洗后:")
print(df)
return df
if __name__ == "__main__":
clean_data()
代码讲解
dropna(how="all")只删整行都是空值的行;how="any"是任意一列空就删整行,慎用。drop_duplicates()默认对所有列判断重复;按某几列去重用subset=["name", "dept"],保留第一条加keep="first"。fillna("未分配")给指定列的空值填默认值,比drop更温和,业务字段一般不建议直接删。pd.to_numeric(..., errors="coerce")把不能转数字的变成NaN,再fillna(0)兜底,避免脏数据导致类型错误。str.strip()去掉字符串前后空格,Excel导出的数据经常带肉眼不可见的空格。
运行结果
控制台打印原始6行(含1行重复、1行全空、若干字段空)和清洗后的5行数据。张三重复行被删掉,李四dept填"未分配",王五salary填0,赵六city填"未知"。
注意事项
- 清洗前先
df.info()看一眼每列非空数量,定位问题列再下手,不要盲目drop。 drop_duplicates后行数变化要len(df)对比,防止把有效数据误删。- 金额列空值别用0填充,0会让汇总金额偏小,业务上应填NaN或单独标记。
- 大文件去重耗内存,必要时
df.sort_values("时间")后再去重,保留最新一条。

更新时间:2026-09-14 20:57:36
上一篇:Python pandas多表合并concat merge详解