又到今天 Pandas学习时间,间隔有一点点久了。我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容:
其中,Pandas 的基础信息导入、数据导入和数据整理已经在前两篇文章里聊过。
先导知识和数据读取/合并见这两篇文章,感兴趣的小伙伴,可以点击链接跳转观看。
这篇文章,我们来聊聊最繁琐的数据探索和数据清洗阶段。数据分析圈里有一个玩笑话,完成一份数据分析报告,其中,有 80%的精力都在做数据探索和数据清洗工作。剩余的 20%才是报告撰写。
使用Pandas进行数据探索和数据清洗是一个系统性的过程。
拿到数据之后,需要看清楚数据长啥样,这部分工作,叫做数据探索。
如果有奇怪的数据,该清洗清洗,该删除删除,空缺的数据,能填充的填充,这部分就叫做数据清洗。
为了方便后续的演示,我创建一个虚拟的Pandas DataFrame来演示数据探索和清洗的过程。假设我们有一个关于汽车销售的数据集,包含以下字段:
-
CarID: 汽车的唯一标识符
-
Model: 汽车型号
-
Year: 年份
-
Price: 价格
-
Origin: 产地
-
MPG: 每加仑英里数(燃油效率)
-
Color: 颜色
import pandas as pd
import numpy as np
# 创建数据的字典
data = {
'CarID': [1, 2, 3, 4, 5],
'Model': ['CarA', 'CarB', 'CarA', 'CarC', 'CarB'],
'Year': [2020, 2019, 2021, 2022, 2018],
'Price': [20000, 22000, 24000, 21000, 19000],
'Origin': ['USA', 'Japan', 'USA', 'Germany', 'USA'],
'MPG': [25, 30, 28, 32, 27],
'Color': ['Red', 'Blue', np.nan, 'Black', 'White']
}
# 创建DataFrame
df = pd.DataFrame(data)
接下来,用这份数据分开讲解数据探索和数据清洗。
01 数据探索 Data Exploration
使用Pandas进行数据探索是一个深入了解数据集特征、识别数据问题和做出数据驱动决策的过程。以下是对虚拟数据集df进行数据探索的详细介绍。
1. 查看数据集的前几行
使用head()函数可以查看数据集的前几行,这有助于快速了解数据的概貌。
print(df.head())
2. 获取数据集的基本信息
info()函数提供了数据集的详细概览,包括每列的数据类型、非空值数量等。
df.info()
3. 描述性统计
describe()函数为数值型列提供了统计摘要,包括计数、平均值、标准差、最小值、四分位数等。
df.describe()
4. 查看数据集的列名
通过columns属性可以查看数据集中所有列的名字。
print(df.columns)
5. 检查缺失值
使用isnull()函数可以检查数据集中的缺失值,sum()函数可以计算每列缺失值的数量。
print(df.isnull().sum())
6. 数据分布
对于分类数据,可以使用value_counts()函数来查看各个类别的出现次数。
df['Origin'].value_counts()
对于数值型数据,可以使用hist()函数绘制直方图来查看分布情况。
df['Price'].hist()
02 数据清洗(Data Cleaning)
1. 处理缺失值
对于缺失值,可以选择填充或删除。
-
填充缺失值:使用fillna()函数填充缺失值,例如用特定值或前一个/后一个值填充。
df['Color'] = df['Color'].fillna('Unknown')
-
删除缺失值:使用dropna()函数删除含有缺失值的行或列。
# 删除含有缺失值的行
df = df.dropna()
# 删除含有缺失值的列,例如如果'Color'列的缺失值太多,可以选择删除整列
df = df.drop(columns=['Color'])
2. 处理重复数据
使用duplicated()或drop_duplicates()函数检查和删除重复的行。
# 检查重复的行
print(df.duplicated())
# 删除重复的行
df = df.drop_duplicates()
3. 数据类型转换
确保每列的数据类型正确,使用astype()函数进行转换。
# 例如,将'Year'列转换为整数类型
df['Year'] = df['Year'].astype(int)
4. 处理异常值
根据业务逻辑或统计方法(如IQR)识别并处理异常值。
Q1 = df['Price'].quantile(0.25)
Q3 = df['Price'].quantile(0.75)
IQR = Q3 - Q1
# 过滤掉异常值
df = df[~((df['Price'] < (Q1 - 1.5 * IQR)) | (df['Price'] > (Q3 + 1.5 * IQR)))]
5. 标准化和归一化
对数值型数据进行标准化或归一化处理,以消除不同量纲的影响。
# 标准化(Z-score normalization)
df['Price_normalized'] = (df['Price'] - df['Price'].mean()) / df['Price'].std()
# 归一化(Min-Max scaling)
df['Price_scaled'] = (df['Price'] - df['Price'].min()) / (df['Price'].max() - df['Price'].min())
6. 特征工程
根据业务需求,可能需要创建新的特征或修改现有特征。
# 例如,从'Year'列创建一个新特征'Age',表示汽车的年龄
df['Age'] = 2024 - df['Year']
7. 数据集筛选和过滤
根据特定条件过滤数据集,这里的条件可以灵活组合。
# 例如,选择价格在20000到25000之间的汽车
df_filtered = df[(df['Price'] >= 20000) & (df['Price'] <= 25000)]
8. 数据集排序
根据某个列对数据集进行排序。
# 例如,根据价格降序排序
df_sorted = df.sort_values(by='Price', ascending=False)
感兴趣的小伙伴,欢迎关注、点赞、评论转发。您的每一份互动,都是我肝下去的动力。