1、格式错误数据
数据格式错误的单元格可能使分析数据变得困难,甚至不可能。要解决此问题,有两个选择:删除行,或将列中的所有单元格转换为相同格式。数据在类型、结构或表示方式上与预期不一致,可能导致数据分析错误或程序运行异常。在 Pandas 中,常见的格式错误包括如下表:
错误类型 | 示例 | 修复方法 |
---|---|---|
空格/特殊字符 | " 123 " 、"abc#" | 使用 .str.strip() 、.str.replace() 清洗 |
大小写不统一 | "Male" 与 "male" | 使用 .str.lower() 或 .str.upper() 统一 |
数据类型错误 | 字符串 "100" 表示数值 | 使用 .astype(int) 或 .to_numeric() 转换 |
日期格式不一致 | '2024/01/01' vs '01-01-2024' | 使用 pd.to_datetime() 标准化日期格式 |
布尔/分类值混乱 | "Yes" 、"yes" 、"Y" 、1 | 使用 .replace() 标准化为一致的值 |
2、转换成正确的格式
在Data Frame中,有两个格式错误的单元格。看看第22行和第26行,'Date'列应该是一个表示日期的字符串:
Duration Date Pulse Maxpulse Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 45 '2020/12/18' 90 112 NaN 19 60 '2020/12/19' 103 123 323.0 20 45 '2020/12/20' 97 125 243.0 21 60 '2020/12/21' 108 131 364.2 22 45 NaN 100 119 282.0 23 60 '2020/12/23' 130 101 300.0 24 45 '2020/12/24' 105 132 246.0 25 60 '2020/12/25' 102 126 334.5 26 60 20201226 100 120 250.0 27 60 '2020/12/27' 92 118 241.0 28 60 '2020/12/28' 103 132 NaN 29 60 '2020/12/29' 100 132 280.0 30 60 '2020/12/30' 102 129 380.3 31 60 '2020/12/31' 92 115 243.0
可以尝试将'Date'列中的所有单元格都转换为日期。
Pandas为此有一个to_datetime()
方法:
例如:
转换为日期:
import pandas as pd
df = pd.read_csv('data.csv')
df['Date'] = pd.to_datetime(df['Date'])
print(df.to_string())
Result:
Duration Date Pulse Maxpulse Calories 0 60 '2020/12/01' 110 130 409.1 1 60 '2020/12/02' 117 145 479.0 2 60 '2020/12/03' 103 135 340.0 3 45 '2020/12/04' 109 175 282.4 4 45 '2020/12/05' 117 148 406.0 5 60 '2020/12/06' 102 127 300.0 6 60 '2020/12/07' 110 136 374.0 7 450 '2020/12/08' 104 134 253.3 8 30 '2020/12/09' 109 133 195.1 9 60 '2020/12/10' 98 124 269.0 10 60 '2020/12/11' 103 147 329.3 11 60 '2020/12/12' 100 120 250.7 12 60 '2020/12/12' 100 120 250.7 13 60 '2020/12/13' 106 128 345.3 14 60 '2020/12/14' 104 132 379.3 15 60 '2020/12/15' 98 123 275.0 16 60 '2020/12/16' 98 120 215.2 17 60 '2020/12/17' 100 120 300.0 18 45 '2020/12/18' 90 112 NaN 19 60 '2020/12/19' 103 123 323.0 20 45 '2020/12/20' 97 125 243.0 21 60 '2020/12/21' 108 131 364.2 22 45 NaT 100 119 282.0 23 60 '2020/12/23' 130 101 300.0 24 45 '2020/12/24' 105 132 246.0 25 60 '2020/12/25' 102 126 334.5 26 60 '2020/12/26' 100 120 250.0 27 60 '2020/12/27' 92 118 241.0 28 60 '2020/12/28' 103 132 NaN 29 60 '2020/12/29' 100 132 280.0 30 60 '2020/12/30' 102 129 380.3 31 60 '2020/12/31' 92 115 243.0
正如从结果中看到的,第26行中的日期是固定的,但是第22行中的空日期得到了一个NaT(不是时间)值,换句话说,是一个空值。处理空值的一种方法是简单地删除整个行。
3、删除行
上面示例中转换的结果提供了一个NaT
值,可以将其作为NULL
值进行处理,可以通过使用
dropna()
方法。
例如:
删除"Date"列中值为NULL的行:
df.dropna(subset=['Date'], inplace = True)
4、错误修复
格式错误数据的清理可通过字符串处理、类型转换和格式标准化等手段实现,是提升数据质量、避免分析误差的重要步骤。
import pandas as pd df = pd.DataFrame({ 'price': [' 100 ', '200$', '300.00'], 'gender': ['Male', 'female', 'FEMALE'], 'date': ['2024/01/01', '01-01-2024', '2024.01.01'] }) # 清洗 price 列中的空格和特殊字符 df['price'] = df['price'].str.replace('[^\d.]', '', regex=True).astype(float) # gender 列统一格式 df['gender'] = df['gender'].str.lower() # 标准化日期 df['date'] = pd.to_datetime(df['date'], errors='coerce') print(df)