Python Pandas 进阶:清洗杂乱的 CSV 数据(含缺失值处理)
·
Python Pandas 进阶:清洗杂乱的 CSV 数据(含缺失值处理)
在处理杂乱的CSV数据时,Pandas是一个强大的工具。本指南将逐步引导您完成数据清洗的全过程,包括缺失值处理、异常值清理和类型转换等。重点在于进阶技巧,确保数据质量。所有步骤基于真实最佳实践,示例代码使用Python 3.x和Pandas库。让我们从基础开始,逐步深入。
步骤1: 读取CSV文件并初步探索
首先,使用pd.read_csv()读取文件,处理常见问题如编码错误或分隔符不匹配。杂乱的CSV可能包含额外空格或不一致格式,添加参数如encoding和skipinitialspace来优化。
import pandas as pd
# 读取CSV文件,处理编码和空格
file_path = "your_data.csv" # 替换为您的文件路径
df = pd.read_csv(file_path, encoding='utf-8', skipinitialspace=True)
# 初步探索数据
print("数据前5行:")
print(df.head())
print("\n数据信息:")
print(df.info())
print("\n统计摘要:")
print(df.describe())
- 关键点:
df.info()显示列类型和缺失值概况;df.describe()提供数值列的统计量,如均值$\mu$和标准差$\sigma$,其中$\mu = \frac{1}{n} \sum_{i=1}^{n} x_i$。
步骤2: 处理缺失值
缺失值是杂乱数据的常见问题。使用isna()识别,然后选择删除或填充。进阶方法包括基于统计或插值填充。
-
识别缺失值:
- 使用
df.isna().sum()计算每列缺失数量。 - 示例:如果某列有30%缺失,考虑填充而非删除。
- 使用
-
删除缺失值:
- 适用场景:缺失比例低(<5%)且不影响分析。
- 代码:
df_cleaned = df.dropna()或指定列df.dropna(subset=['column_name'])。
-
填充缺失值:
- 常用方法:
- 数值列:用均值$\mu$、中位数或众数填充。例如,均值填充:
df['column'].fillna(df['column'].mean(), inplace=True)。 - 分类列:用众数或自定义值(如"Unknown")。
- 数值列:用均值$\mu$、中位数或众数填充。例如,均值填充:
- 进阶插值:时间序列数据用
interpolate(),如线性插值。 - 公式示例:中位数是排序后中间值,当$n$为奇数时,位置$\frac{n+1}{2}$;当$n$为偶数时,平均$\frac{x_{\frac{n}{2}} + x_{\frac{n}{2}+1}}{2}$。
- 常用方法:
# 示例:填充数值列缺失值
if df['numeric_column'].isna().sum() > 0:
mean_value = df['numeric_column'].mean() # 计算均值
df['numeric_column'].fillna(mean_value, inplace=True)
# 分类列用众数填充
mode_value = df['category_column'].mode()[0]
df['category_column'].fillna(mode_value, inplace=True)
# 时间序列插值
df['timestamp_column'] = pd.to_datetime(df['timestamp_column'])
df['timestamp_column'] = df['timestamp_column'].interpolate(method='linear')
步骤3: 清洗其他杂乱数据
缺失值处理后,处理重复值、异常值和类型错误。
-
去除重复值:
- 使用
df.drop_duplicates()删除完全重复行。 - 进阶:基于关键列去重,如
df.drop_duplicates(subset=['id_column'])。
- 使用
-
处理异常值:
- 识别方法:使用IQR(四分位距)或Z-score。
- IQR计算:$Q1$为第一四分位数(25%分位),$Q3$为第三四分位数(75%分位),$IQR = Q3 - Q1$。
- 异常值阈值:小于$Q1 - 1.5 \times IQR$或大于$Q3 + 1.5 \times IQR$。
- 处理:删除或winsorize(用边界值替换)。
- 代码示例:
# 计算IQR Q1 = df['numeric_column'].quantile(0.25) Q3 = df['numeric_column'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR # 删除异常值 df = df[(df['numeric_column'] >= lower_bound) & (df['numeric_column'] <= upper_bound)]
- 识别方法:使用IQR(四分位距)或Z-score。
-
类型转换和字符串清洗:
- 转换列类型:
df['column'] = df['column'].astype('int')。 - 字符串处理:去除空格、统一大小写或正则表达式替换。
- 示例:
df['text_column'] = df['text_column'].str.strip().str.lower()。 - 进阶:用
apply()自定义函数,如提取日期格式。
- 示例:
- 转换列类型:
步骤4: 进阶技巧和完整流程
结合以上步骤,使用链式方法或分组处理提升效率。
- 链式操作:用
pipe()或方法链减少临时变量。 - 分组填充:基于类别分组后填充缺失值,更精准。
# 分组填充均值 df['filled_column'] = df.groupby('category_column')['numeric_column'].transform(lambda x: x.fillna(x.mean())) - 自定义函数:用
apply()处理复杂逻辑,如结合多个条件清洗。
完整示例代码:
import pandas as pd
# 读取和初步清洗
df = pd.read_csv("your_data.csv", encoding='utf-8', skipinitialspace=True)
df.columns = df.columns.str.strip() # 清洗列名空格
# 处理缺失值
for col in df.select_dtypes(include=['number']).columns:
if df[col].isna().any():
df[col].fillna(df[col].median(), inplace=True) # 用中位数填充数值列
for col in df.select_dtypes(include=['object']).columns:
if df[col].isna().any():
df[col].fillna(df[col].mode()[0], inplace=True) # 用众数填充分类列
# 去除重复和异常值
df = df.drop_duplicates()
numeric_cols = df.select_dtypes(include=['number']).columns
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
df = df[(df[col] >= Q1 - 1.5 * IQR) & (df[col] <= Q3 + 1.5 * IQR)]
# 类型转换和最终输出
df['date_column'] = pd.to_datetime(df['date_column'], errors='coerce') # 转换日期,无效值设为NaT
df = df.dropna(subset=['date_column']) # 删除无效日期
print("清洗后数据摘要:")
print(df.info())
df.to_csv("cleaned_data.csv", index=False) # 保存清洗后数据
总结
通过本指南,您学会了使用Pandas进阶清洗杂乱CSV数据:
- 核心步骤:读取探索 → 缺失值处理(删除/填充) → 异常值清理 → 类型转换。
- 进阶重点:基于IQR或分组填充提升精度;数学基础如均值$\mu$和IQR$= Q3 - Q1$确保方法可靠。
- 最佳实践:始终先探索数据再清洗,保存中间结果防数据丢失。实际应用中,调整参数适应您的数据集。如果您有特定数据问题,提供更多细节,我可以进一步优化方案!
更多推荐
所有评论(0)