用Pandas进行数据清洗:一个英雄数据集的实战案例

在数据分析项目中,数据清洗往往占据了80%的时间。今天,我将通过一个英雄数据集(hero.xlsx)的实际例子,展示如何使用Pandas完成常见的数据清洗任务。

一、数据初探

首先,我们读取Excel文件并查看数据的基本信息:

import pandas as pd
df = pd.read_excel('hero.xlsx')
df.info()

df.info() 可以快速了解DataFrame的行数列数、每列的非空值数量以及数据类型,帮助我们定位潜在问题。

二、清除重复值

重复数据会影响统计结果的准确性。我们检查并删除基于英雄名称的重复记录:

# 查看重复的英雄名称
df[df.duplicated(subset='英雄名称', keep=False)]

# 删除重复项,保留第一次出现的记录
df = df.drop_duplicates(subset='英雄名称', keep='first')

# 再次验证是否还有重复
df[df.duplicated(subset='英雄名称', keep=False)]

三、处理空值

1. 检查空值分布

df.isnull().sum()

2. 删除关键列的空值

对于英雄ID这样的关键字段,空值记录无法使用,直接删除:

# 查看英雄ID为空的行
df[df['英雄ID'].isnull()]

# 删除这些行
df = df.dropna(subset='英雄ID')

# 确认删除成功
df[df['英雄ID'].isnull()]

3. 填充非关键列的空值

  • 次要定位:没有次要定位的英雄,填充为'无

  • 上线年份:用众数或合理值填充(示例中填充为'2018年'

  • 最大生命:用中位数或经验值填充(示例填充为3500

df['次要定位'] = df['次要定位'].fillna('无')
df.loc[df['上线年份'].isnull(), '上线年份'] = '2018年'
df.loc[df['最大生命'].isnull(), '最大生命'] = 3500

再次检查空值:

df.isnull().sum()

四、数据类型与格式修正

1. 单位转换

例如攻速成长列中,部分值可能以百分比形式存储(如1.2表示120%),我们需要将大于等于1的值除以100转为小数:

df.loc[df['攻速成长'] >= 1, '攻速成长'] = df.loc[df['攻速成长'] >= 1, '攻速成长'] / 100

2. 提取并转换年份

上线年份中的'年字去掉,并转换为整数类型:

df['上线年份'] = df['上线年份'].str.replace('年', '')
df['上线年份'] = df['上线年份'].astype(int)

五、异常值检测

检查数值列是否存在超出合理范围的记录:

# 登场率应在0~100之间
df[(df['登场率'] < 0) | (df['登场率'] > 100)]

# 最大生命值应在1000~5000之间
df[(df['最大生命'] < 1000) | (df['最大生命'] > 5000)]

如果发现异常值,可以根据业务规则进行删除或修正(示例中未做处理,仅展示检测方法)。

六、特征工程与清理

1. 创建新特征(示例后删除)

df['综合攻击'] = df['物理攻击'] + df['法术攻击']

2. 删除不需要的列

df = df.drop(columns='综合攻击')

七、重置索引

删除行后索引可能不连续,建议重置:

df.reset_index(drop=True, inplace=True)

八、保存清洗后的数据

最后,将干净的DataFrame保存到新的Excel文件:

df.to_excel('new_hero.xlsx', index=False)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值