在上一篇文章中,我们讨论了数据选择与过滤的相关内容,尤其是在使用 Pandas
进行数据操作时,如何高效地选择和过滤数据。现在我们将重点关注数据清洗与处理,这是数据分析过程中至关重要的一步。
什么是数据清洗?
数据清洗(Data Cleaning)是指对数据进行检测和修正的过程。数据往往会有缺失值、异常值或者不一致的格式,清洗数据的目的是提高数据的质量,使得后续的分析和建模更加准确。
常见的数据清洗步骤:
- 处理缺失值
- 处理重复数据
- 标准化数据格式
- 处理异常值
- 数据转换
处理缺失值
在数据集中,缺失值是常见的问题。我们可以通过 Pandas
的 isnull()
方法和 fillna()
方法来处理缺失值。
示例
假设我们有一个关于学生成绩的数据如下:
1 2 3 4 5 6 7 8 9 10
| import pandas as pd
data = { '姓名': ['小明', '小红', '小刚', None, '小丽'], '数学': [95, 88, None, 70, 85], '英语': [None, 82, 76, 90, 95] }
df = pd.DataFrame(data) print(df)
|
输出结果为:
1 2 3 4 5 6
| 姓名 数学 英语 0 小明 95.0 NaN 1 小红 88.0 82.0 2 小刚 NaN 76.0 3 None 70.0 90.0 4 小丽 85.0 95.0
|
在这个数据集中,我们可以看到缺失的姓名、数学以及英语分数。我们可以选择删除包含缺失值的行或者用某个特定值填充缺失值。
1 2 3 4 5 6
| df['数学'].fillna(df['数学'].mean(), inplace=True) df['英语'].fillna(df['英语'].mean(), inplace=True)
print(df)
|
输出结果为:
1 2 3 4 5 6
| 姓名 数学 英语 0 小明 95.0 86.60 1 小红 88.0 82.00 2 小刚 83.00 76.00 3 None 70.0 90.00 4 小丽 85.0 95.00
|
处理重复数据
有时候,数据集中可能会有重复的行。我们可以使用 duplicated()
方法来查找重复的行,并使用 drop_duplicates()
方法来删除它们。
示例
假设我们的数据集中包含重复记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| data = { '姓名': ['小明', '小红', '小刚', '小明', '小丽', '小红'], '数学': [95, 88, 80, 95, 85, 88], }
df = pd.DataFrame(data) print("原始数据:") print(df)
duplicates = df.duplicated() print("\n重复行:") print(df[duplicates])
df.drop_duplicates(inplace=True) print("\n去重后的数据:") print(df)
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 原始数据: 姓名 数学 0 小明 95 1 小红 88 2 小刚 80 3 小明 95 4 小丽 85 5 小红 88
重复行: 姓名 数学 3 小明 95 5 小红 88
去重后的数据: 姓名 数学 0 小明 95 1 小红 88 2 小刚 80 4 小丽 85
|
标准化数据格式
在数据清洗的过程中,有时候我们需要标准化字段的格式,例如日期格式或字符串的大小写。
示例
假设我们的数据集中日期的格式不一致,我们需要将它们转换为统一的格式:
1 2 3 4 5 6 7 8 9 10
| data = { '姓名': ['小明', '小红'], '生日': ['1990-01-01', '1992/05/15'] }
df = pd.DataFrame(data)
df['生日'] = pd.to_datetime(df['生日']) print(df)
|
输出结果为:
1 2 3
| 姓名 生日 0 小明 1990-01-01 1 小红 1992-05-15
|
处理异常值
异常值指的是与其他数据点明显不同的值。我们可以用统计学方法,比如标准差、箱型图等,来识别异常值,并进行处理。
示例
下面的代码展示了如何使用标准差来处理异常值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| data = { '分数': [55, 60, 65, 70, 100, 150] }
df = pd.DataFrame(data)
mean = df['分数'].mean() std = df['分数'].std()
threshold = 3 outliers = df[(df['分数'] < mean - threshold * std) | (df['分数'] > mean + threshold * std)]
print("异常值:") print(outliers)
df = df[~df['分数'].isin(outliers['分数'])] print("\n去除异常值后的数据:") print(df)
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11
| 异常值: 分数 5 150
去除异常值后的数据: 分数 0 55 1 60 2 65 3 70 4 100
|
数据转换
数据转换是指将数据从一种格式转换为另一种格式,通常是在数据分析前的一步。
示例
例如,我们需要将一列的分数从百分制转换为五分制:
1 2 3 4 5 6 7 8 9 10
| data = { '姓名': ['小明', '小红', '小刚'], '分数': [95, 85, 70] }
df = pd.DataFrame(data)
df['五分制分数'] = (df['分数'] / 100) * 5 print(df)
|
输出结果为:
姓名 分数