在Pandas中进行数据清洗是非常重要的步骤,以确保数据分析的质量和准确性。本文将详细介绍如何使用df.dropna()
, df.fillna()
, 和 df.duplicated()
进行数据预处理。
1. df.dropna()
: 删除含有缺失值的行或列
df.dropna()
方法可以用来删除DataFrame中包含任何NaN值的行或列。默认情况下,它会删除包含至少一个NaN值的行。
基本用法:
# 删除包含NaN值的行
df_cleaned = df.dropna()
# 删除包含NaN值的列
df_cleaned = df.dropna(axis=1)
参数详解:
axis
: 0 表示按行操作(默认),1 表示按列操作。how
: ‘any’(默认)表示如果某行/列有任何一个NaN值,则删除该行/列;‘all’ 表示只有当某行/列的所有值都是NaN时才删除。thresh
: 指定最少的非空值数量。例如,thresh=3
表示一行必须至少有3个非空值才能保留。subset
: 指定检查的列标签列表。
示例:
import pandas as pd
import numpy as np
data = {'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3]}
df = pd.DataFrame(data)
# 删除包含NaN值的行
df_cleaned = df.dropna()
print(df_cleaned)
# 删除包含NaN值的列
df_cleaned = df.dropna(axis=1)
print(df_cleaned)
2. df.fillna()
: 填充缺失值
df.fillna()
方法用于用特定值填充DataFrame中的NaN值。
基本用法:
# 使用0填充所有NaN值
df_filled = df.fillna(0)
# 使用前一个有效值填充
df_filled = df.fillna(method='ffill')
# 使用后一个有效值填充
df_filled = df.fillna(method='bfill')
参数详解:
value
: 单一值、字典或Series,用于填充NaN值。method
: ‘ffill’ 或 ‘pad’ 代表前向填充,‘bfill’ 或 ‘backfill’ 代表后向填充。limit
: 限制填充的次数。
示例:
# 使用0填充NaN值
df_filled = df.fillna(0)
print(df_filled)
# 使用前一个有效值填充
df_filled = df.fillna(method='ffill')
print(df_filled)
3. df.duplicated()
: 识别重复项
df.duplicated()
方法返回一个布尔Series,指示DataFrame中的每一行是否是重复的。
基本用法:
# 检查是否有重复行
duplicates = df.duplicated()
print(duplicates)
# 删除重复行
df_unique = df.drop_duplicates()
print(df_unique)
参数详解:
keep
: ‘first’(默认)表示保留第一次出现的行,之后的重复行标记为True;‘last’ 表示保留最后一次出现的行;False 表示所有重复行都标记为True。subset
: 指定检查重复性的列标签列表。
示例:
data = {'A': [1, 1, 2, 3], 'B': [5, 5, 6, 7], 'C': [1, 1, 2, 3]}
df = pd.DataFrame(data)
# 检查是否有重复行
duplicates = df.duplicated()
print(duplicates)
# 删除重复行
df_unique = df.drop_duplicates()
print(df_unique)
4.示例
有一个包含用户信息的数据集,其中包括姓名、年龄、电子邮件、注册日期和最后登录日期。我们将演示如何处理缺失值、异常值、格式不一致等问题。
首先,我们需要导入必要的库:
import pandas as pd
import numpy as np
然后,创建一个带有问题的数据集:
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', np.nan],
'Age': [28, np.nan, 32, 45, 35],
'Email': ['alice@example.com', 'bob@example.com', '', 'david@example.com', 'charlie@example.com'],
'RegistrationDate': ['2020-01-01', '2020-02-02', '2020-03-03', '2020-04-04', '2020-05-05'],
'LastLogin': ['2020-06-06', '2020-07-07', '2020-08-08', '2020-09-09', '2020-10-10']
}
df = pd.DataFrame(data)
处理缺失值
我们可以使用dropna()
或fillna()
来处理缺失值。例如,删除任何含有缺失值的行:
df_cleaned = df.dropna()
或者填充缺失值,比如用平均年龄填充Age
列的缺失值:
mean_age = df['Age'].mean()
df['Age'] = df['Age'].fillna(mean_age)
处理异常值
假设我们定义年龄超过60岁为异常值,我们可以用中位数替换这些值:
df.loc[df['Age'] > 60, 'Age'] = df['Age'].median()
处理格式不一致
我们可以清理电子邮件字段,去除空字符串,并统一格式:
df['Email'] = df['Email'].replace('', np.nan).fillna('unknown@example.com')
统一日期格式
将日期字段从字符串转换为日期格式,并处理不一致的格式:
df['RegistrationDate'] = pd.to_datetime(df['RegistrationDate'], errors='coerce')
数据类型转换
如果Age
列中有非数值数据,我们可以将其转换回数值类型:
df['Age'] = pd.to_numeric(df['Age'], errors='coerce')
一个完整的数据清洗流程
# 处理缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())
df['Email'] = df['Email'].replace('', np.nan).fillna('unknown@example.com')
# 处理异常值
df.loc[df['Age'] > 60, 'Age'] = df['Age'].median()
# 处理日期格式
df['RegistrationDate'] = pd.to_datetime(df['RegistrationDate'], errors='coerce')
# 转换数据类型
df['Age'] = pd.to_numeric(df['Age'], errors='coerce')