本文主要介绍使用pandas对数据表中的问题进行清洗,主要是对空值、大小写问题、数据格式和重复值的处理。
一、处理空值(删除或填充)
1、删除无效值所在行
- axis:可选参数,表示删除行还是列。默认值为0,表示删除包含缺失值的行;设置为1表示删除包含缺失值的列。
- how:可选参数,表示删除的条件。默认值为’any’,表示只要存在一个缺失值就删除整行或整列;设置为’all’表示只有当整行或整列都是缺失值时才删除。
- thresh:可选参数,表示在删除之前需要满足的非缺失值的最小数量。如果行或列中的非缺失值数量小于等于thresh,则会被删除。
- subset:可选参数,用于指定要检查缺失值的特定列名或行索引。
- inplace:可选参数,表示是否对原始数据进行就地修改。默认值为False,表示不修改原始数据,而是返回一个新的数据框
import pandas as pd |
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘深圳’ ‘100-B’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
2、填充值
- value:用于填充的空值的值。
- method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
- axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
- inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
- limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
- downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
填充0.
import pandas as pd |
填充均值:
import pandas as pd |
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘深圳’ ‘100-B’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘深圳’ ‘100-B’ 44 3299.5]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 3299.5]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
二、清理空格
import pandas as pd |
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘ 深圳’ ‘100-B’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘深圳’ ‘100-B’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
三、大小写转换
import pandas as pd |
df['category'] = df['category'].str.upper()
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-A’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘ 深圳’ ‘100-B’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-A’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-C’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-A’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-F’ 32 4432.0]]
[[1001 Timestamp(‘2024-01-02 00:00:00’) ‘东莞’ ‘100-a’ 23 1200.0]
[1002 Timestamp(‘2024-01-03 00:00:00’) ‘ 深圳’ ‘100-b’ 44 nan]
[1003 Timestamp(‘2024-01-04 00:00:00’) ‘广州’ ‘110-a’ 54 2133.0]
[1004 Timestamp(‘2024-01-05 00:00:00’) ‘北京’ ‘110-c’ 32 5433.0]
[1005 Timestamp(‘2024-01-06 00:00:00’) ‘上海’ ‘210-a’ 34 nan]
[1006 Timestamp(‘2024-01-07 00:00:00’) ‘南京’ ‘130-f’ 32 4432.0]]
四、更改数据格式
import pandas as pd |
id int64 date datetime64[ns]
city object category object age int64 price float64 dtype: object id int64 date datetime64[ns]
city object category object age int64 price int64 dtype: object
五、更改列名称
import pandas as pd |
id int64
date datetime64[ns]
city object
category object
age int64
price int64
dtype: object
id int64
date datetime64[ns]
area object
category object
age int64
price int64
dtype: object
六、删除重复值
- subset – 指定特定的列 默认所有列
- keep:{‘first’, ‘last’, False} – 删除重复项并保留第一次出现的项,默认第一个keep=False – 表示删除所有重复项 不保留
- inplace – 是否直接修改原对象
- ignore_index=True – 重置索引,dataframe自身索引
import pandas as pd |
0 北京
1 南京
2 天津
3 东莞
4 广州
5 深圳
6 深圳
Name: area, dtype: object
0 北京
1 南京
2 天津
3 东莞
4 广州
5 深圳
Name: area, dtype: object
七、数值修改及替换
替换某列:
import pandas as pd |
替换所有:df.replace('北京', 'BJ', inplace=True)
0 北京
1 南京
2 天津
3 东莞
4 广州
5 深圳
Name: area, dtype: object
0 BJ
1 南京
2 天津
3 东莞
4 广州
5 深圳
Name: area, dtype: object
还支持多个替换项一起替换、正则表达式替换。
多个替换项:df.replace({'A':'B',99:100}, inplace=True)
df.replace(['A',99], ['B',100], inplace=True)
正则表达式替换:df.replace('[A-Z]', '大写字母', regex=True)