WEBKT

Pandas 数据清洗、转换、分析与探索性数据分析 (EDA) 实战指南

392 0 0 0

Pandas 数据清洗、转换、分析与探索性数据分析 (EDA) 实战指南

大家好,我是你们的“数据老司机”!今天咱们来聊聊 Python 数据分析的利器——Pandas。Pandas 就像一把瑞士军刀,功能强大,能帮你轻松搞定数据清洗、转换、分析和探索性数据分析 (EDA)。别担心,我会用大白话,结合实战代码,让你彻底掌握 Pandas 的精髓。

为什么要用 Pandas?

想想你平时处理数据是不是经常遇到这些头疼的问题:

  • 数据格式乱七八糟,有缺失值、重复值、异常值...
  • 需要对数据进行各种转换,比如类型转换、分组、聚合...
  • 想快速了解数据的分布、趋势、相关性...

Pandas 就是来拯救你的!它提供了高效的数据结构 (DataFrame 和 Series),以及丰富的函数和方法,让你用几行代码就能搞定这些复杂的操作。说白了,Pandas 就是让你更高效、更轻松地处理数据。

Pandas 核心概念

在开始实战之前,咱们先来认识 Pandas 的两个核心概念:

  • Series:一维带标签数组,可以理解为一列数据,每个数据都有一个索引 (标签)。
  • DataFrame:二维带标签数据结构,可以理解为一张表格,由多个 Series 组成,每个 Series 都有一个列名。

实战演练:从数据清洗到 EDA

接下来,咱们就通过一个实战案例,一步步演示如何用 Pandas 进行数据清洗、转换、分析和 EDA。我会尽量把每一步都讲清楚,让你知其然,更知其所以然。

1. 数据加载

首先,我们需要把数据加载到 Pandas 的 DataFrame 中。Pandas 支持多种数据格式,比如 CSV、Excel、JSON、SQL 数据库等等。这里,我们以 CSV 文件为例:

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('your_data.csv')  # 把 'your_data.csv' 替换成你的文件名

# 查看前几行数据
print(df.head())

pd.read_csv() 函数会返回一个 DataFrame 对象。df.head() 可以查看 DataFrame 的前几行数据 (默认是 5 行),让你对数据有个初步的了解。

2. 数据清洗

数据清洗是数据分析的第一步,也是最重要的一步。原始数据往往包含各种问题,我们需要把这些问题处理掉,才能进行后续的分析。

2.1 缺失值处理

缺失值是指数据中某些字段的值为空。Pandas 提供了多种处理缺失值的方法:

  • 删除缺失值df.dropna()
  • 填充缺失值df.fillna()
# 删除包含缺失值的行
df_dropna = df.dropna()

# 用特定值填充缺失值 (比如用 0 填充)
df_fillna = df.fillna(0)

# 用平均值填充缺失值
df_fillna_mean = df.fillna(df.mean())

# 用中位数填充缺失值
df_fillna_median = df.fillna(df.median())

# 用众数填充缺失值 (适用于分类数据)
df_fillna_mode = df.fillna(df.mode().iloc[0]) #mode()返回的是一个DataFrame,需要用iloc[0]取第一行

# 使用ffill(前向填充)或者bfill(后向填充)
df_ffill = df.ffill()
df_bfill = df.bfill()

选择哪种方法取决于你的数据和业务需求。一般来说,如果缺失值比例很小,可以直接删除;如果缺失值比例较大,或者缺失值有特定含义,可以考虑填充。

思考过程: 为什么要提供这么多缺失值处理方法?因为不同的数据、不同的业务场景,需要不同的处理方式。没有一种方法是万能的,只有最合适的。

2.2 重复值处理

重复值是指数据中存在完全相同的行。Pandas 提供了 df.duplicated()df.drop_duplicates() 来处理重复值。

# 检查是否有重复值
duplicates = df.duplicated()
print(duplicates.any())  # 如果有重复值,返回 True

# 删除重复值
df_no_duplicates = df.drop_duplicates()

# 根据某些列删除重复值
df_no_duplicates_subset = df.drop_duplicates(subset=['column1', 'column2'])

df.duplicated() 会返回一个布尔型的 Series,表示每一行是否是重复值。df.drop_duplicates() 会删除重复值,默认保留第一次出现的行。subset 参数可以指定根据哪些列来判断重复值。

2.3 异常值处理

异常值是指数据中明显偏离其他值的观测值。异常值可能是由于数据错误、测量误差或者真实的极端情况导致的。Pandas 提供了多种检测和处理异常值的方法。

  • 基于统计学的方法:比如 3σ 原则 (超出平均值 ± 3 倍标准差的值被认为是异常值)。
  • 基于箱线图的方法:超出箱线图上下边界的值被认为是异常值。
# 基于 3σ 原则检测异常值
mean = df['column'].mean()
std = df['column'].std()
threshold_upper = mean + 3 * std
threshold_lower = mean - 3 * std
outliers = df[(df['column'] > threshold_upper) | (df['column'] < threshold_lower)]

# 基于箱线图检测异常值 (需要结合可视化,后面会讲到)

# 处理异常值:删除、替换、或者单独分析
# ...

异常值处理需要谨慎,因为异常值可能包含有价值的信息。在处理异常值之前,最好先了解异常值产生的原因。

2.4 数据类型转换

数据类型转换是指将数据从一种类型转换为另一种类型,比如将字符串转换为数字、将日期字符串转换为日期对象等等。Pandas 提供了 astype() 方法来进行类型转换。

# 将某列转换为整数类型
df['column'] = df['column'].astype(int)

# 将某列转换为浮点数类型
df['column'] = df['column'].astype(float)

# 将某列转换为字符串类型
df['column'] = df['column'].astype(str)

# 将某列转换为日期类型
df['date_column'] = pd.to_datetime(df['date_column'])

astype() 方法可以接受多种类型参数,比如 intfloatstrdatetime 等等。pd.to_datetime() 函数可以将日期字符串转换为日期对象,方便后续的日期处理。

3. 数据转换

数据转换是指对数据进行各种变换,比如分组、聚合、排序、合并等等。Pandas 提供了丰富的函数和方法来支持这些操作。

3.1 分组和聚合

分组和聚合是数据分析中常用的操作。Pandas 提供了 groupby() 方法来进行分组,然后可以使用各种聚合函数 (比如 sum()mean()count() 等等) 来对每个分组进行计算。

# 根据某列进行分组,并计算每个分组的平均值
grouped_mean = df.groupby('column1')['column2'].mean()

# 根据多列进行分组,并计算每个分组的总和
grouped_sum = df.groupby(['column1', 'column2'])['column3'].sum()

# 使用多个聚合函数
grouped_agg = df.groupby('column1').agg({'column2': 'mean', 'column3': 'sum'})

groupby() 方法可以接受一个或多个列名作为分组依据。聚合函数可以对每个分组进行各种计算。agg() 方法可以同时使用多个聚合函数。

3.2 排序

Pandas 提供了 sort_values() 方法来对数据进行排序。

# 根据某列进行升序排序
df_sorted = df.sort_values(by='column')

# 根据某列进行降序排序
df_sorted_desc = df.sort_values(by='column', ascending=False)

# 根据多列进行排序
df_sorted_multi = df.sort_values(by=['column1', 'column2'])

sort_values() 方法可以接受一个或多个列名作为排序依据。ascending 参数可以控制排序方向 (True 表示升序,False 表示降序)。

3.3 数据合并

Pandas 提供了 merge()concat() 函数来合并多个 DataFrame。

# 根据某列合并两个 DataFrame (类似于 SQL 中的 JOIN)
df_merged = pd.merge(df1, df2, on='column')

# 沿着行方向合并多个 DataFrame (类似于 SQL 中的 UNION)
df_concat = pd.concat([df1, df2, df3])

merge() 函数类似于 SQL 中的 JOIN 操作,可以根据一个或多个公共列来合并两个 DataFrame。concat() 函数可以沿着行方向或列方向合并多个 DataFrame。

4. 数据分析与 EDA

数据分析和 EDA (探索性数据分析) 是数据分析的核心环节。Pandas 提供了丰富的函数和方法来帮助我们了解数据的分布、趋势、相关性等等。

4.1 描述性统计

Pandas 提供了 describe() 方法来生成数据的描述性统计信息,比如平均值、标准差、最小值、最大值、四分位数等等。

df_description = df.describe()
print(df_description)

describe() 方法会返回一个 DataFrame,包含每个数值型列的描述性统计信息。这可以帮助我们快速了解数据的分布情况。

4.2 相关性分析

Pandas 提供了 corr() 方法来计算列之间的相关系数。

correlation_matrix = df.corr()
print(correlation_matrix)

corr() 方法会返回一个 DataFrame,表示每对列之间的相关系数。相关系数的取值范围是 [-1, 1],绝对值越大表示相关性越强,正数表示正相关,负数表示负相关。

4.3 数据可视化

数据可视化是 EDA 的重要组成部分。Pandas 可以与 Matplotlib 和 Seaborn 等可视化库结合使用,生成各种图表。

import matplotlib.pyplot as plt
import seaborn as sns

# 直方图
df['column'].hist()
plt.show()

# 散点图
plt.scatter(df['column1'], df['column2'])
plt.show()

# 箱线图
sns.boxplot(x='column1', y='column2', data=df)
plt.show()

# 热力图 (显示相关系数矩阵)
sns.heatmap(correlation_matrix, annot=True)
plt.show()

通过可视化,我们可以更直观地了解数据的分布、趋势、相关性等等。

总结

今天,我们一起学习了如何用 Pandas 进行数据清洗、转换、分析和 EDA。Pandas 是一个非常强大的工具,可以大大提高数据分析的效率。希望这篇实战指南能帮助你更好地掌握 Pandas,成为一名“数据高手”!

记住,实践出真知!多动手,多练习,你就能熟练掌握 Pandas 的各种技巧。

如果你有任何问题,或者想了解更多 Pandas 的知识,欢迎留言交流!

进阶提示:

  • Pandas 还有很多高级功能,比如时间序列分析、透视表、多层索引等等。可以参考 Pandas 官方文档进行学习。
  • 可以结合其他数据分析库 (比如 NumPy、Scikit-learn) 一起使用,发挥更大的威力。
数据老司机 Pandas数据分析EDA

评论点评