【python】pandas数据清洗(一)

在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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值