Python 数据清洗实战指南:100 个实用技巧优化数据集质量。

数据清洗是数据预处理流程中的核心环节,其核心目标是确保数据集的准确性,为后续分析与建模奠定基础。
本文整理了100个Python代码片段,覆盖缺失值处理、重复项删除、数据类型转换、日期时间特征提取及文本数据清洗等典型场景。每个片段均针对实际数据清洗痛点提供轻量化解决方案,助力开发者高效完成数据预处理,为深度数据分析与建模提供优质数据支撑。
1. 删除重复行
`df.drop_duplicates()`
2. 用均值填充缺失值
`df.fillna(df.mean())`
3. 删除包含缺失值的行
`df.dropna()`
4. 用零填充缺失值
`df.fillna(0)`
5. 重命名列
`df.rename(columns={'old_name': 'new_name'})`
6. 去除列名中的空格
`df.columns = df.columns.str.strip()`
7. 转换列的数据类型
`df['column'] = df['column'].astype('new_type')`
8. 去除字符串中的特殊字符
`df['column'] = df['column'].str.replace('[^a-zA-Z0-9]', '')`
9. 转换字符串为小写
`df['column'] = df['column'].str.lower()`
10. 转换字符串为大写
`df['column'] = df['column'].str.upper()`
11. 从日期中提取年份
`df['year'] = pd.to_datetime(df['date']).dt.year`
12. 将分类数据转换为数值数据
`df['category'] = pd.Categorical(df['category']).codes`
13. 使用Z-score去除异常值
`df = df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]`
14. 将时间戳转换为日期时间
`df['timestamp'] = pd.to_datetime(df['timestamp'])`
15. 从日期中提取月份
`df['month'] = pd.to_datetime(df['date']).dt.month`
16. 去除字符串首尾空格
`df['column'] = df['column'].str.strip()`
17. 删除不需要的列
`df.drop(['col1', 'col2'], axis=1, inplace=True)`
18. 将分类数据转换为独热编码
`pd.get_dummies(df, columns=['category'])`
19. 标准化数值列
`df['column'] = (df['column'] - df['column'].mean()) / df['column'].std()`
20. 将文本数据转换为小写
`df['text'] = df['text'].str.lower()`
21. 去除HTML标签
`df['text'] = df['text'].replace('<[^<]+?>', '', regex=True)`
22. 去除所有列中字符串的首尾空格
`df = df.apply(lambda x: x.str.strip() if x.dtype == 'object' else x)`
23. 合并两个DataFrame
`result = pd.concat([df1, df2], axis=0, ignore_index=True)`
24. 基于键合并两个DataFrame
`merged_df = pd.merge(df1, df2, on='key')`
25. 将日期时间转换为字符串
`df['date_str'] = df['date'].dt.strftime('%Y-%m-%d')`
26. 根据条件删除行
`df = df[df['column'] > threshold]`
27. 替换列中的值
`df['column'].replace({'old_val': 'new_val'}, inplace=True)`
28. 将分类数据转换为序数编码
`df['category'] = df['category'].astype('category').cat.codes`
29. 将秒转换为分钟
`df['minutes'] = df['seconds'] / 60`
30. 使用IQR去除异常值
`df = df[~((df['column'] < Q1 - 1.5 * IQR) | (df['column'] > Q3 + 1.5 * IQR))]`
31. 将日期时间转换为星期几
`df['day_of_week'] = df['date'].dt.day_name()`
32. 基于多个条件过滤行
`df = df[(df['col1'] > threshold) & (df['col2'] == 'value')]`
33. 将分类数据转换为虚拟编码
`pd.get_dummies(df, columns=['category'], prefix='prefix')`
34. 从电子邮件地址中提取域名
`df['domain'] = df['email'].str.split('@').str[1]`
35. 将文本数据转换为大写
`df['text'] = df['text'].str.upper()`
36. 删除特定列中具有重复值的行
`df.drop_duplicates(subset=['col1', 'col2'])`
37. 将时间间隔转换为天数
`df['days'] = df['timedelta'].dt.days`
38. 删除包含零值的行
`df = df[(df != 0).all(1)]`
39. 从日期时间中提取时间
`df['time'] = df['datetime'].dt.time`
40. 将字符串转换为日期时间
`df['date'] = pd.to_datetime(df['date_str'], format='%Y-%m-%d')`
41. 提取列中的唯一值
`unique_values = df['column'].unique()`
42. 将文本数据转换为首字母大写格式
`df['text'] = df['text'].str.title()`
43. 根据值列表删除行
`df = df[~df['column'].isin(['val1', 'val2'])]`
44. 删除特定列中包含NaN的行
`df.dropna(subset=['col1', 'col2'])`
45. 将Unix时间戳转换为日期时间
`df['datetime'] = pd.to_datetime(df['timestamp'], unit='s')`
46. 将分类数据转换为频率编码
`df['category_freq'] = df['category'].map(df['category'].value_counts())`
47. 基于正则表达式模式过滤行
`df = df[df['text'].str.contains('pattern', regex=True)]`
48. 将字符串转换为布尔值
`df['flag'] = df['flag'].map({'True': True, 'False': False})`
49. 删除所有列中具有重复值的行
`df = df.drop_duplicates()`
50. 将日期时间转换为年月格式
`df['month_year'] = df['date'].dt.to_period('M')`
51. 删除列中包含特定子字符串的行
`df = df[~df['text'].str.contains('substring')]`
52. 将分类数据转换为标签编码
`from sklearn.preprocessing import LabelEncoder; le = LabelEncoder(); df['category'] = le.fit_transform(df['category'])`
53. 从日期时间中提取时间
`df['time'] = df['datetime'].dt.time`
54. 将日期时间转换为季度
`df['quarter'] = df['date'].dt.to_period('Q')`
55. 删除任意列中包含缺失值的行
`df.dropna(axis=0, how='any', inplace=True)`
56. 将文本数据转换为句子首字母大写格式
`df['text'] = df['text'].apply(lambda x: x.capitalize())`
57. 删除列中具有特定值的行
`df = df[df['column'] != 'value']`
58. 将持续时间转换为秒
`df['seconds'] = df['duration'].dt.total_seconds()`
59. 删除特定列中具有重复值的行(保留第一个)
`df.drop_duplicates(subset=['col1', 'col2'], keep='first')`
60. 将文本数据转换为蛇形命名(snake_case)
`df.columns = df.columns.str.lower().str.replace(' ', '_')`
61. 删除多个列中具有特定值的行
`df = df[~df.isin({'col1': ['val1'], 'col2': ['val2']}).all(axis=1)]`
62. 将文本数据转换为短横线命名(kebab-case)
`df['column'] = df['column'].str.replace(' ', '-').str.lower()`
63. 删除值超出范围的行
`df = df[(df['column'] >= min_val) & (df['column'] <= max_val)]`
64. 将日期时间转换为年龄
`df['age'] = (pd.to_datetime('today') - df['birthdate']).astype('<m8[Y]')`
65. 根据值列表删除行
`df = df[~df['column'].isin(['val1', 'val2'])]`
66. 将文本数据转换为驼峰命名(camelCase)
`df.columns = df.columns.str.replace(' ', '').str.lower()`
67. 删除多个列中具有特定条件的行
`df = df[~((df['col1'] == 'val1') & (df['col2'] > threshold))]`
68. 将文本数据转换为缩写
`df['acronym'] = df['text'].apply(lambda x: ''.join(word[0] for word in x.split()))`
69. 删除多个列中包含特定子字符串的行
`df = df[~df.apply(lambda x: x.astype(str).str.contains('substring')).any(axis=1)]`
70. 将持续时间转换为分钟
`df['minutes'] = df['duration'].dt.total_seconds() / 60`
71. 使用查询语句删除列中具有特定值的行
`df = df.query('column != "value"')`
72. 将带有货币符号的字符串转换为浮点数
`df['amount'] = df['amount'].replace('[\$,]', '', regex=True).astype(float)`
73. 使用查询语句删除多个列中具有特定值的行
`df = df.query('col1 != "val1" & col2 != "val2"')`
74. 将带有百分比符号的字符串转换为浮点数
`df['percentage'] = df['percentage'].replace('[\%,]', '', regex=True).astype(float) / 100`
75. 使用查询语句删除列中包含特定子字符串的行
`df = df.query('column.str.contains("substring") == False')`
76. 根据条件将文本数据转换为指定大小写
`df['text'] = df['text'].apply(lambda x: x.lower() if condition else x.upper())`
77. 使用查询语句删除多个列中包含特定子字符串的行
`df = df.query('~(col1.str.contains("sub1") | col2.str.contains("sub2"))')`
78. 使用映射将文本数据转换为指定大小写
`df['text'] = df['text'].map({'lower': str.lower, 'upper': str.upper})`
79. 使用loc删除列中具有特定值的行
`df = df.loc[df['column'] != 'value']`
80. 使用自定义格式将字符串转换为日期时间
`df['date'] = pd.to_datetime(df['date_str'], format='%d-%m-%Y')`
81. 使用loc删除多个列中具有特定条件的行
`df = df.loc[~((df['col1'] == 'val1') & (df['col2'] > threshold))]`
82. 使用applymap将文本数据转换为指定大小写
`df = df.applymap(lambda x: x.lower() if isinstance(x, str) else x)`
83. 使用loc删除列中包含特定子字符串的行
`df = df.loc[~df['column'].str.contains('substring')]`
84. 将带有时区的字符串转换为日期时间
`df['datetime'] = pd.to_datetime(df['timestamp'], unit='s').dt.tz_localize('UTC').dt.tz_convert('America/New_York')`
85. 使用loc删除多个列中具有特定值的行
`df = df.loc[~((df['col1'] == 'val1') | (df['col2'] == 'val2'))]`
86. 使用apply将文本数据转换为指定大小写
`df['text'] = df['text'].apply(lambda x: x.lower() if condition else x.upper())`
87. 使用loc删除多个列中包含特定子字符串的行
`df = df.loc[~(df['col1'].str.contains('sub1') | df['col2'].str.contains('sub2'))]`
88. 将带有科学计数法的字符串转换为浮点数
`df['value'] = df['value'].astype(float)`
89. 使用布尔索引删除列中具有特定值的行
`df = df[~(df['column'] == 'value')]`
90. 将包含日期和时间的字符串转换为日期时间
`df['datetime'] = pd.to_datetime(df['date_str'] + ' ' + df['time_str'], format='%Y-%m-%d %H:%M:%S')`
91. 使用布尔索引删除多个列中具有特定条件的行
`df = df[~((df['col1'] == 'val1') & (df['col2'] > threshold))]`
92. 将带有二进制值的字符串转换为布尔值
`df['flag'] = df['flag'].map({'True': True, 'False': False})`
93. 使用布尔索引删除列中包含特定子字符串的行
`df = df[~df['column'].str.contains('substring')]`
94. 将带有十六进制值的字符串转换为十进制数
`df['value'] = df['value'].apply(lambda x: int(x, 16))`
95. 使用布尔索引删除多个列中具有特定值的行
`df = df[~((df['col1'] == 'val1') | (df['col2'] == 'val2'))]`
96. 将带有罗马数字的字符串转换为整数
`df['value'] = df['value'].apply(lambda x: roman.fromRoman(x))`
97. 使用布尔索引删除多个列中包含特定子字符串的行
`df = df[~(df['col1'].str.contains('sub1') | df['col2'].str.contains('sub2'))]`
98. 使用int将带有二进制值的字符串转换为十进制数
`df['value'] = df['value'].apply(lambda x: int(x, 2))`
99. 使用查询语句删除列中具有特定值的行
`df = df.query('column != "value"')`
100. 将带有百分比符号的字符串转换为浮点数
`df['percentage'] = df['percentage'].replace('[\%,]', '', regex=True).astype(float) / 100`