Pandas 中,清理错误格式的数据是数据清洗的重要环节,常见操作包括使用字符串方法处理不规范文本(如去除空格、统一大小写、删除特殊字符)、通过 astype() 转换数据类型、使用 to_datetime() 统一时间格式,以及利用布尔条件筛选和替换非法值,从而确保数据一致性和可用性。本文主要介绍Python Pandas 清理错误格式数据。

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)

推荐文档