首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 25个数据清洗技巧:让你的数据质量提升10倍

Python 25个数据清洗技巧:让你的数据质量提升10倍

作者头像
用户11081884
发布2026-07-20 20:04:34
发布2026-07-20 20:04:34
410
举报

你有没有过这样的经历?

辛辛苦苦跑了一天代码,结果因为数据质量太差,得出了一堆错误结论。说实话,我之前也踩过不少坑。

直到我系统掌握了数据清洗技巧,才发现原来可以这么高效。

今天我整理了25个实用的Python数据清洗技巧,从缺失值处理到数据转换,从文本清洗到异常值检测,帮你一次搞定所有数据质量问题。

记住一句话:垃圾进,垃圾出。数据清洗不是浪费时间,而是在为你的分析保驾护航。


1. 检测缺失值

第一步先看看数据里有多少缺失值,做到心中有数。

代码语言:javascript
复制
import pandas as pd
import numpy as np

data = {'A': [1, 2, np.nan, 4], 'B': ['x', np.nan, 'z', 'w'], 'C': [5, 6, 7, 8]}
df = pd.DataFrame(data)

# 检测每列的缺失值数量
missing_values = df.isnull().sum()
print("缺失值统计:\n", missing_values)

2. 删除缺失值

缺失值太多的时候,直接删除可能是最快的方法。

代码语言:javascript
复制
# 删除包含缺失值的行
df_drop_rows = df.dropna()
print("删除含缺失值的行:\n", df_drop_rows)

# 删除包含缺失值的列
df_drop_cols = df.dropna(axis=1)
print("删除含缺失值的列:\n", df_drop_cols)

3. 填充缺失值

不想删除的话,就用合理的方式填充。比如用平均值、中位数,或者前一个有效值。

代码语言:javascript
复制
# 用列平均值填充数值型缺失值
df_fill_mean = df.fillna(df.mean())
print("用平均值填充:\n", df_fill_mean)

# 用前一个有效值填充(前向填充)
df_fill_forward = df.fillna(method='ffill')
print("前向填充:\n", df_fill_forward)

4. 去除重复值

重复数据会干扰分析结果,要及时清理。

代码语言:javascript
复制
data = {'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
        'age': [25, 30, 25, 35, 30]}
df = pd.DataFrame(data)

# 去除完全重复的行
df_no_duplicates = df.drop_duplicates()
print("去重后的数据:\n", df_no_duplicates)

5. 基于特定列去重

有时候只想根据某一列去重,保留其他信息。

代码语言:javascript
复制
# 基于name列去重,保留第一次出现的记录
df_no_duplicates = df.drop_duplicates(subset=['name'])
print("基于name列去重:\n", df_no_duplicates)

6. 文本数据标准化

字符串里的空格、大小写问题,统一清洗一下。

代码语言:javascript
复制
text_data = {'text': ['  Python ', 'JAVA  ', '  C++ ', 'R ']}
df_text = pd.DataFrame(text_data)

# 去除空格并转为小写
df_text['cleaned'] = df_text['text'].str.strip().str.lower()
print("清洗后的文本:\n", df_text)

7. 正则表达式清洗

移除文本中的数字和特殊字符,只保留想要的。

代码语言:javascript
复制
# 移除文本中的数字和特殊字符
df_text['regex_cleaned'] = df_text['text'].str.replace(r'[^a-zA-Z\s]', '', regex=True)
print("正则清洗后的文本:\n", df_text)

8. 数据类型转换

类型不对会出大问题,确保每列都是正确的数据类型。

代码语言:javascript
复制
mixed_data = {'numbers': ['1', '2', '3', '4'], 'booleans': ['True', 'False', 'True', 'False']}
df_mixed = pd.DataFrame(mixed_data)

# 转换数据类型
df_mixed['numbers'] = df_mixed['numbers'].astype(int)
df_mixed['booleans'] = df_mixed['booleans'].astype(bool)
print("转换后的数据类型:\n", df_mixed.dtypes)

9. 日期时间格式化

日期格式五花八门,统一转换成标准格式很重要。

代码语言:javascript
复制
date_data = {'dates': ['2023-01-01', '01/02/2023', 'March 3, 2023', '04-04-2023']}
df_dates = pd.DataFrame(date_data)

# 统一日期格式
df_dates['formatted'] = pd.to_datetime(df_dates['dates'], errors='coerce')
print("标准化的日期:\n", df_dates)

10. 离群值检测

异常值会拉偏整体趋势,用Z-score检测一下。

代码语言:javascript
复制
from scipy import stats

data = {'values': [10, 12, 11, 15, 10, 100, 9, 12, 11, 10]}
df_outliers = pd.DataFrame(data)

# 使用Z-score检测离群值
z_scores = np.abs(stats.zscore(df_outliers['values']))
df_outliers['is_outlier'] = z_scores > 2
print("离群值检测结果:\n", df_outliers)

11. 分箱离散化

把连续数据分成几个区间,方便分析和展示。

代码语言:javascript
复制
ages = [22, 25, 30, 35, 40, 45, 50, 55, 60, 65]
df_ages = pd.DataFrame({'age': ages})

# 将年龄分箱
bins = [20, 30, 40, 50, 60, 70]
labels = ['20s', '30s', '40s', '50s', '60s']
df_ages['age_group'] = pd.cut(df_ages['age'], bins=bins, labels=labels)
print("年龄分箱结果:\n", df_ages)

12. 数据标准化

不同量纲的数据放在一起分析,需要先标准化。

代码语言:javascript
复制
from sklearn.preprocessing import StandardScaler

data = {'feature1': [100, 200, 300, 400, 500],
        'feature2': [0.1, 0.2, 0.3, 0.4, 0.5]}
df_scale = pd.DataFrame(data)

# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df_scale)
df_scaled = pd.DataFrame(scaled_data, columns=df_scale.columns)
print("标准化后的数据:\n", df_scaled)

13. 独热编码

分类变量不能直接参与计算,要转换成数值。

代码语言:javascript
复制
categories = ['red', 'blue', 'green', 'blue', 'red', 'green']
df_cat = pd.DataFrame({'color': categories})

# 独热编码
df_encoded = pd.get_dummies(df_cat, columns=['color'])
print("独热编码结果:\n", df_encoded)

14. 标签编码

类别不多的时候,标签编码比独热编码更节省空间。

代码语言:javascript
复制
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df_cat['color_label'] = le.fit_transform(df_cat['color'])
print("标签编码结果:\n", df_cat)

15. 表合并与连接

数据分散在不同表里,需要合并到一起。

代码语言:javascript
复制
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]})

# 内连接
df_inner = pd.merge(df1, df2, on='key', how='inner')
print("内连接结果:\n", df_inner)

# 左连接
df_left = pd.merge(df1, df2, on='key', how='left')
print("左连接结果:\n", df_left)

16. 数据透视表

快速汇总数据,按不同维度聚合统计。

代码语言:javascript
复制
data = {
    'city': ['北京', '上海', '北京', '上海', '北京'],
    'category': ['A', 'A', 'B', 'B', 'A'],
    'value': [100, 200, 150, 250, 120]
}
df = pd.DataFrame(data)

pivot = pd.pivot_table(df, values='value', index='city', columns='category', aggfunc='sum')
print("透视表结果:\n", pivot)

17. 字符串提取

从文本中提取特定模式的内容。

代码语言:javascript
复制
data = {'text': ['用户ID:12345', '订单号:67890', '编号:11111']}
df = pd.DataFrame(data)

# 提取数字
df['numbers'] = df['text'].str.extract(r':(\d+)')
print("提取结果:\n", df)

18. 时间序列重采样

时间序列数据经常需要按不同时间粒度聚合。

代码语言:javascript
复制
date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
data = {'date': date_rng, 'value': range(10)}
df = pd.DataFrame(data).set_index('date')

# 按3天重采样并求和
resampled = df.resample('3D').sum()
print("重采样结果:\n", resampled)

19. 处理嵌套JSON数据

JSON数据嵌套太深,需要展平成表格。

代码语言:javascript
复制
import json
from pandas import json_normalize

json_data = '''
{
  "employees": [
    {
      "name": "John",
      "age": 30,
      "address": {
        "city": "New York",
        "zip": "10001"
      }
    }
  ]
}
'''

data = json.loads(json_data)
df = json_normalize(data['employees'])
print("展平后的数据:\n", df)

20. 数据验证与约束

确保数据符合业务规则,避免后续分析出错。

代码语言:javascript
复制
# 自定义数据验证
def validate_data(df):
    errors = []
    # 年龄必须在18-100之间
    if 'age' in df.columns:
        invalid_age = df[(df['age'] < 18) | (df['age'] > 100)]
        if not invalid_age.empty:
            errors.append(f"年龄异常: {len(invalid_age)}条")

    # 邮箱必须包含@
    if 'email' in df.columns:
        invalid_email = df[~df['email'].str.contains('@', na=False)]
        if not invalid_email.empty:
            errors.append(f"邮箱异常: {len(invalid_email)}条")

    return errors

data = {'age': [25, 30, 17], 'email': ['a@b.com', 'c@d.com', 'invalid']}
df = pd.DataFrame(data)
errors = validate_data(df)
print("验证结果:", errors)

21. 中位数填充

有离群值时,中位数比平均值更稳健。

代码语言:javascript
复制
data = {'A': [1, 2, None, 4, 100]}
df = pd.DataFrame(data)

# 用中位数填充
df_filled = df.fillna(df.median())
print("中位数填充结果:\n", df_filled)

22. 条件替换

根据条件批量替换数据,比循环快得多。

代码语言:javascript
复制
data = {'age': [15, 20, 25, 30, 35]}
df = pd.DataFrame(data)

# 年龄小于18的替换为18
df['age'] = df['age'].where(df['age'] >= 18, 18)
print("条件替换结果:\n", df)

23. 滚动窗口计算

时间序列数据常用滚动统计来平滑波动。

代码语言:javascript
复制
data = {'date': pd.date_range('2023-01-01', periods=10),
        'value': [10, 12, 11, 15, 10, 13, 14, 12, 16, 15]}
df = pd.DataFrame(data).set_index('date')

# 3天移动平均
df['rolling_mean'] = df['value'].rolling(window=3).mean()
print("滚动窗口结果:\n", df)

24. 多条件筛选

复杂筛选用query方法,代码更清晰。

代码语言:javascript
复制
data = {
    'city': ['北京', '上海', '广州', '北京', '上海'],
    'sales': [100, 200, 150, 120, 180],
    'category': ['A', 'B', 'A', 'B', 'A']
}
df = pd.DataFrame(data)

# 多条件筛选
result = df.query("city == '北京' and sales > 110")
print("筛选结果:\n", result)

25. 数据去重并保留最新

重复数据中保留最后一条,通常是最新的信息。

代码语言:javascript
复制
data = {
    'id': [1, 2, 1, 3, 2],
    'value': [100, 200, 150, 300, 250],
    'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']
}
df = pd.DataFrame(data)

# 按id去重,保留最新日期的记录
df['date'] = pd.to_datetime(df['date'])
df_latest = df.sort_values('date').drop_duplicates('id', keep='last')
print("去重并保留最新:\n", df_latest)

💡 写在最后

这25个技巧覆盖了数据清洗中最常见的场景。记住,数据清洗不是一次性工作,而是一个持续的过程。

实战建议:

✓ 先做数据探索,了解数据全貌

✓ 从简单处理开始,逐步深入

✓ 保留原始数据,方便回滚

✓ 记录清洗过程,方便复用

数据质量决定分析的上限。花在数据清洗上的时间,永远不会是浪费。

你平时用哪些数据清洗技巧?有没有踩过什么坑?评论区聊聊吧~


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 检测缺失值
  • 2. 删除缺失值
  • 3. 填充缺失值
  • 4. 去除重复值
  • 5. 基于特定列去重
  • 6. 文本数据标准化
  • 7. 正则表达式清洗
  • 8. 数据类型转换
  • 9. 日期时间格式化
  • 10. 离群值检测
  • 11. 分箱离散化
  • 12. 数据标准化
  • 13. 独热编码
  • 14. 标签编码
  • 15. 表合并与连接
  • 16. 数据透视表
  • 17. 字符串提取
  • 18. 时间序列重采样
  • 19. 处理嵌套JSON数据
  • 20. 数据验证与约束
  • 21. 中位数填充
  • 22. 条件替换
  • 23. 滚动窗口计算
  • 24. 多条件筛选
  • 25. 数据去重并保留最新
  • 💡 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档