
数据清洗是数据分析流程中不可或缺的环节,高质量的数据分析才有价值。本文介绍20个实用的Python数据清洗技巧,帮助高效处理各种数据质量问题。
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)# 删除包含缺失值的行
df_drop_rows = df.dropna()
print("删除含缺失值的行:\n", df_drop_rows)
# 删除包含缺失值的列
df_drop_cols = df.dropna(axis=1)
print("删除含缺失值的列:\n", df_drop_cols)# 用列平均值填充数值型缺失值
df_fill_mean = df.fillna(df.mean())
print("用平均值填充:\n", df_fill_mean)
# 用前一个有效值填充
df_fill_forward = df.fillna(method='ffill')
print("前向填充:\n", df_fill_forward)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)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)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)# 移除文本中的数字和特殊字符
df_text['regex_cleaned'] = df_text['text'].str.replace(r'[^a-zA-Z\s]', '', regex=True)
print("正则清洗后的文本:\n", df_text)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)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)import numpy as np
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)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)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)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)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)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)缺失值处理有多种策略,包括删除、填充等。
# 创建含缺失值的数据
data = {'A': [1, 2, None, 4], 'B': [5, None, 7, 8]}
df = pd.DataFrame(data)
# 用列均值填充缺失值
df_filled = df.fillna(df.mean())
print(df_filled)使用正则表达式提取特定模式的数据。
# 创建含缺失值的数据
data = {'A': [1, 2, None, 4], 'B': [5, None, 7, 8]}
df = pd.DataFrame(data)
# 用列均值填充缺失值
df_filled = df.fillna(df.mean())
print(df_filled)对时间序列数据进行重采样。
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(resampled)展平嵌套的JSON数据结构。
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(df)为数据添加验证规则。
from pandera import DataFrameSchema, Column, Check
schema = DataFrameSchema({
"age": Column(int, Check(lambda x: x >= 18)),
"email": Column(str, Check(lambda x: "@" in x))
})
data = {'age': [25, 30, 17], 'email': ['a@b.com', 'c@d.com', 'invalid']}
df = pd.DataFrame(data)
# 验证数据
try:
schema.validate(df)
except Exception as e:
print("数据验证失败:", e)20个Python数据清洗技巧涵盖了数据预处理中最常见的场景,从缺失值处理到数据转换,从文本清洗到表合并。掌握这些技巧可以显著提高数据分析效率和数据质量。在实际项目中需要组合使用多个技巧来处理复杂的数据质量问题来达到最佳清洗效果。
“无他,惟手熟尔”!有需要的用起来。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!😊
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!