本文目录导读:

针对Python脚本快速修复项目数据问题,可以按照以下步骤和常用方法操作:
先诊断问题类型
# 快速诊断数据问题
import pandas as pd
import numpy as np
def diagnose_data(df):
"""快速诊断数据问题"""
report = {}
# 1. 缺失值检查
report['missing_values'] = df.isnull().sum()
# 2. 重复值检查
report['duplicates'] = df.duplicated().sum()
# 3. 数据类型检查
report['dtypes'] = df.dtypes
# 4. 异常值检查(数值列)
num_cols = df.select_dtypes(include=[np.number]).columns
for col in num_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)]
if len(outliers) > 0:
report[f'{col}_outliers'] = len(outliers)
return report
常见问题快速修复
缺失值处理
def fix_missing_values(df, strategy='auto'):
"""快速修复缺失值"""
if strategy == 'auto':
for col in df.columns:
if df[col].dtype in ['object', 'category']:
df[col].fillna(df[col].mode()[0] if not df[col].mode().empty else 'Unknown', inplace=True)
else:
df[col].fillna(df[col].median(), inplace=True)
elif strategy == 'drop':
df.dropna(inplace=True)
elif strategy == 'interpolate':
df.interpolate(method='linear', inplace=True)
return df
重复数据处理
def fix_duplicates(df, subset=None, keep='first'):
"""快速修复重复数据"""
# 找出重复行
duplicates = df[df.duplicated(subset=subset, keep=False)]
if len(duplicates) > 0:
print(f"发现 {len(duplicates)} 行重复数据")
# 去重
df_clean = df.drop_duplicates(subset=subset, keep=keep)
print(f"去重后剩余 {len(df_clean)} 行")
return df_clean
return df
数据类型修正
def fix_dtypes(df):
"""快速修正数据类型"""
for col in df.columns:
# 尝试转换为数值类型
if df[col].dtype == 'object':
try:
df[col] = pd.to_numeric(df[col], errors='coerce')
print(f"列 {col} 转换为数值类型")
except:
pass
# 日期格式转换
if 'date' in col.lower() or 'time' in col.lower():
try:
df[col] = pd.to_datetime(df[col], errors='coerce')
print(f"列 {col} 转换为日期类型")
except:
pass
return df
异常值处理
def fix_outliers(df, method='clip'):
"""快速处理异常值"""
num_cols = df.select_dtypes(include=[np.number]).columns
for col in num_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
if method == 'clip':
df[col] = df[col].clip(lower_bound, upper_bound)
elif method == 'remove':
df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]
elif method == 'median':
median_val = df[col].median()
df.loc[(df[col] < lower_bound) | (df[col] > upper_bound), col] = median_val
return df
一键修复脚本
def quick_fix_data(data_path, output_path=None):
"""一键修复数据问题"""
# 读取数据
if data_path.endswith('.csv'):
df = pd.read_csv(data_path)
elif data_path.endswith('.xlsx'):
df = pd.read_excel(data_path)
else:
raise ValueError("不支持的格式")
print("="*50)
print("数据修复开始...")
print(f"原始数据: {df.shape}")
# 1. 诊断问题
report = diagnose_data(df)
print("\n诊断报告:", report)
# 2. 修复缺失值
df = fix_missing_values(df)
print("缺失值已修复")
# 3. 修复重复值
df = fix_duplicates(df)
print("重复值已处理")
# 4. 修正数据类型
df = fix_dtypes(df)
print("数据类型已修正")
# 5. 处理异常值
df = fix_outliers(df)
print("异常值已处理")
print(f"\n修复后数据: {df.shape}")
print("="*50)
# 保存结果
if output_path:
if output_path.endswith('.csv'):
df.to_csv(output_path, index=False)
elif output_path.endswith('.xlsx'):
df.to_excel(output_path, index=False)
print(f"数据已保存到: {output_path}")
return df
# 使用示例
# df = quick_fix_data('data.csv', 'fixed_data.csv')
特定场景修复
# 文本数据清洗
def clean_text_data(df, text_columns):
"""清洗文本列"""
for col in text_columns:
if col in df.columns:
# 去除多余空格
df[col] = df[col].str.strip()
# 统一大小写
df[col] = df[col].str.lower()
# 去除特殊字符
df[col] = df[col].str.replace(r'[^\w\s]', '', regex=True)
return df
# ID/关联键修复
def fix_primary_key(df, key_column):
"""修复主键问题"""
# 检查空值
null_keys = df[key_column].isnull().sum()
if null_keys > 0:
print(f"发现 {null_keys} 个空主键")
# 生成唯一标识
max_id = df[key_column].max()
for idx in df[df[key_column].isnull()].index:
max_id += 1
df.at[idx, key_column] = max_id
return df
使用建议
- 备份数据:修改前先备份原始数据
- 增量修复:每次只修复特定类型的问题
- 日志记录:记录修复操作和影响的行数
- 单元测试:编写测试验证修复逻辑
- 批量处理:使用chunksize处理大文件
# 安全修复示例
def safe_fix(data_path):
import shutil
# 1. 创建备份
backup_path = data_path.replace('.', '_backup.')
shutil.copy2(data_path, backup_path)
print(f"备份已创建: {backup_path}")
# 2. 分步修复
df = pd.read_csv(data_path, chunksize=10000)
# 3. 记录日志
log_entries = []
for i, chunk in enumerate(df):
original_shape = chunk.shape
chunk = fix_missing_values(chunk)
log_entries.append(f"Chunk {i}: {original_shape} -> {chunk.shape}")
# 4. 保存日志
with open('fix_log.txt', 'w') as f:
f.write('\n'.join(log_entries))
return log_entries
根据具体的数据问题和项目需求,选择合适的修复方法组合使用。