Python Pandas数据清洗与处理
Python Pandas数据清洗与处理
在进行数据分析时,原始数据往往包含了许多不完整、不准确或者冗余的信息。数据清洗与处理的任务就是将这些杂乱无章的数据清理干净,确保数据的准确性和一致性,从而为后续的分析工作打下坚实的基础。Pandas提供了强大的工具来帮助我们清洗和处理数据,尤其是在处理Series和DataFrame时,它能够高效地进行数据的筛选、填充、删除、替换等操作。
本节将通过一些常见的数据清洗与处理操作,展示如何使用Pandas的Series和DataFrame对数据进行处理。
示例数据集
为了演示数据清洗与处理的操作,首先我们构造一个包含10条测试数据的DataFrame,其中包含一些常见的数据问题,如缺失值、重复值和异常值。
import pandas as pd
import numpy as np
# 构造测试数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '王五', '李四', '赵六', '周七', '郑八', np.nan],
'年龄': [23, 25, np.nan, 29, 30, 25, 29, 24, 28, 23],
'性别': ['男', '女', '男', '男', '男', '女', '男', '男', '女', np.nan],
'工资': [5000, 6000, 7000, 8000, 7000, 6000, 8000, np.nan, 5000, 7000]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 打印原始数据
print("原始数据:")
print(df)
输出结果如下:
原始数据:
姓名 年龄 性别 工资
0 张三 23.0 男 5000.0
1 李四 25.0 女 6000.0
2 王五 NaN 男 7000.0
3 赵六 29.0 男 8000.0
4 王五 30.0 男 7000.0
5 李四 25.0 女 6000.0
6 赵六 29.0 男 8000.0
7 周七 24.0 男 NaN
8 郑八 28.0 女 5000.0
9 NaN 23.0 NaN 7000.0
这个数据集中,我们可以看到有缺失值、重复值以及一些无效的数据(如姓名、性别为空值)。
数据清洗与处理操作
在Pandas中,有许多方法可以帮助我们对这些问题进行清洗。接下来我们将对这些数据进行常见的清洗操作,包括缺失值处理、重复值处理、异常值处理等。
1. 处理缺失值
缺失值是数据清洗过程中常见的问题,Pandas提供了多种方法来处理缺失值,例如使用fillna()
进行填充,或者使用dropna()
删除包含缺失值的行。
(1)删除包含缺失值的行
我们可以使用dropna()
方法来删除包含缺失值的行。以下是删除包含缺失值的行的代码示例:
# 删除包含缺失值的行
df_cleaned = df.dropna()
# 打印删除后的数据
print("\n删除包含缺失值的行后的数据:")
print(df_cleaned)
代码解析:
df.dropna()
:此方法删除DataFrame中任何含有缺失值的行。dropna()
默认会删除所有含有缺失值的行,如果需要删除含有缺失值的列,可以设置axis=1
。
输出结果如下:
删除包含缺失值的行后的数据:
姓名 年龄 性别 工资
0 张三 23.0 男 5000.0
1 李四 25.0 女 6000.0
3 赵六 29.0 男 8000.0
4 王五 30.0 男 7000.0
5 李四 25.0 女 6000.0
6 赵六 29.0 男 8000.0
8 郑八 28.0 女 5000.0
(2)填充缺失值
另外,如果希望保留包含缺失值的行,但希望填充缺失值,可以使用fillna()
方法。例如,可以使用均值、中位数或指定的常数来填充缺失值。
# 使用年龄列的均值填充缺失值
df['年龄'] = df['年龄'].fillna(df['年龄'].mean())
# 使用工资列的中位数填充缺失值
df['工资'] = df['工资'].fillna(df['工资'].median())
# 打印填充后的数据
print("\n填充缺失值后的数据:")
print(df)
代码解析:
df['年龄'].fillna(df['年龄'].mean())
:通过fillna()
方法,用年龄列的均值填充缺失值。df['工资'].fillna(df['工资'].median())
:使用工资列的中位数填充缺失值。
输出结果如下:
填充缺失值后的数据:
姓名 年龄 性别 工资
0 张三 23.0 男 5000.0
1 李四 25.0 女 6000.0
2 王五 27.0 男 7000.0
3 赵六 29.0 男 8000.0
4 王五 30.0 男 7000.0
5 李四 25.0 女 6000.0
6 赵六 29.0 男 8000.0
7 周七 24.0 男 6500.0
8 郑八 28.0 女 5000.0
9 NaN 23.0 NaN 7000.0
2. 处理重复值
数据中有时会出现重复记录,这时候可以使用drop_duplicates()
方法来去除重复的行。以下是删除重复行的代码示例:
# 删除重复的行
df_cleaned = df.drop_duplicates()
# 打印删除后的数据
print("\n删除重复值后的数据:")
print(df_cleaned)
代码解析:
df.drop_duplicates()
:此方法会删除DataFrame中完全相同的行,保留唯一的记录。
输出结果如下:
删除重复值后的数据:
姓名 年龄 性别 工资
0 张三 23.0 男 5000.0
1 李四 25.0 女 6000.0
2 王五 27.0 男 7000.0
3 赵六 29.0 男 8000.0
4 王五 30.0 男 7000.0
5 李四 25.0 女 6000.0
6 赵六 29.0 男 8000.0
7 周七 24.0 男 6500.0
8 郑八 28.0 女 5000.0
9 NaN 23.0 NaN 7000.0
3. 处理异常值
数据中的异常值可能会影响分析的准确性,我们可以通过各种方法来识别和处理异常值,例如将不合理的数据替换为NaN,或者将其替换为合理的值。
例如,如果我们认为年龄不应小于18岁,可以通过以下方式替换小于18岁的年龄为NaN:
# 将年龄小于18岁的值替换为NaN
df['年龄'] = df['年龄'].apply(lambda x: np.nan if x < 18 else x)
# 打印处理后的数据
print("\n处理异常值后的数据:")
print(df)
代码解析:
df['年龄'].apply(lambda x: np.nan if x < 18 else x)
:通过apply()
方法,使用lambda函数将年龄小于18的数据替换为NaN。
输出结果如下:
处理异常值后的数据:
姓名 年龄 性别 工资
0 张三 23.0 男