我的知识记录

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("时间") 后再去重,保留最新一条。

Python pandas数据清洗去重去空实战

标签:

更新时间:2026-09-14 20:57:36

上一篇:Python pandas多表合并concat merge详解

下一篇:Python pandas数据类型转换astype详解