【Python】100个pandas数据清洗小技巧,助你快速完成数据处理

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`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值