Pandas快速上手:数据分析与处理实用教程

Pandas 快速上手:数据分析与处理实用教程

Pandas 是 Python 数据科学生态系统中最受欢迎的库之一,以其强大的数据分析和处理能力而闻名。它提供了高效的数据结构和操作工具,使得数据清洗、转换、分析和可视化变得轻松快捷。本教程将带你快速入门 Pandas,掌握其核心概念和常用操作,助你高效处理各种数据分析任务。

1. 为什么选择 Pandas?

  • 基于 NumPy 构建: Pandas 构建在 NumPy 之上,继承了 NumPy 的高性能数组计算能力。
  • 数据结构丰富: 提供了 Series (一维数组) 和 DataFrame (二维表格) 两种核心数据结构,能够灵活地表示各种类型的数据。
  • 数据操作便捷: 内置了大量数据操作函数,如数据清洗、过滤、排序、分组、聚合等,无需编写复杂的循环代码。
  • 与其他库集成良好: 可以与 Matplotlib、Seaborn 等可视化库无缝衔接,轻松实现数据可视化。
  • 社区活跃: 拥有庞大的用户和开发者社区,遇到问题可以轻松获得帮助和解决方案。

2. 安装与导入

安装 Pandas 非常简单,可以使用 pip 命令:

bash
pip install pandas

在 Python 代码中导入 Pandas:

python
import pandas as pd

通常使用 pd 作为 Pandas 的别名,这是一种约定俗成的做法。

3. 核心数据结构:Series 和 DataFrame

  • Series:一维带标签数组

    Series 类似于一维数组,但每个元素都带有一个标签,称为索引 (index)。

    ```python

    创建一个 Series

    s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
    print(s)

    输出结果:

    a 1

    b 3

    c 5

    d 7

    e 9

    dtype: int64

    访问元素

    print(s['b']) # 输出:3
    print(s[1]) # 输出:3 (也支持通过位置访问)

    Series 属性

    print(s.values) # 输出:[1 3 5 7 9] (值)
    print(s.index) # 输出:Index(['a', 'b', 'c', 'd', 'e'], dtype='object') (索引)
    ```

  • DataFrame:二维表格数据结构

    DataFrame 是 Pandas 中最常用的数据结构,它类似于一个二维表格,由多个 Series 组成,每个 Series 代表一列,所有 Series 共享同一个索引。

    ```python

    创建一个 DataFrame

    data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 28, 32],
    'City': ['New York', 'London', 'Paris', 'Tokyo']}
    df = pd.DataFrame(data)
    print(df)

    输出结果:

    Name Age City

    0 Alice 25 New York

    1 Bob 30 London

    2 Charlie 28 Paris

    3 David 32 Tokyo

    访问列

    print(df['Name']) # 输出:Series 包含所有 Name
    print(df.Age) # 另一种访问列的方式 (列名是合法的 Python 变量名时才可以使用)

    访问行 (使用 .loc 或 .iloc)

    print(df.loc[0]) # 通过标签访问第一行
    print(df.iloc[0]) # 通过位置访问第一行

    DataFrame 属性

    print(df.shape) # 输出:(4, 3) (行数, 列数)
    print(df.columns) # 输出:Index(['Name', 'Age', 'City'], dtype='object') (列名)
    print(df.index) # 输出:RangeIndex(start=0, stop=4, step=1) (行索引)
    print(df.info()) # 显示 DataFrame 的基本信息 (列名、数据类型、非空值数量等)
    print(df.describe())# 显示 DataFrame 的统计信息 (均值、标准差、最小值、最大值等)

    ```

4. 数据读取与写入

Pandas 支持多种数据格式的读取和写入,例如 CSV、Excel、JSON、SQL 数据库等。

  • 读取 CSV 文件:

    python
    df = pd.read_csv('data.csv') # 假设有一个名为 data.csv 的文件

    pd.read_csv 还有很多参数可以定制,如:
    * sep: 指定分隔符,默认为逗号。
    * header: 指定哪一行作为列名,默认为第一行。
    * index_col: 指定哪一列作为行索引。
    * encoding: 指定文件编码。
    * skiprows: 跳过指定的行
    * nrows: 只读取指定数量的行。

  • 写入 CSV 文件:

    python
    df.to_csv('output.csv', index=False) # 将 DataFrame 写入 output.csv,不包含行索引

    pd.to_csv 常用参数:
    * index: 是否写入行索引,默认为 True.
    * sep: 指定分隔符
    * header: 是否写入列名,默认为True
    * encoding: 指定文件编码

  • 读取 Excel 文件:

    python
    df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 读取名为 data.xlsx 的 Excel 文件中名为 Sheet1 的工作表

  • 写入 Excel 文件:

    python
    df.to_excel('output.xlsx', sheet_name='Sheet1', index=False) # 将 DataFrame 写入 output.xlsx,工作表名为 Sheet1,不包含行索引

5. 数据清洗与处理

Pandas 提供了丰富的数据清洗和处理功能,这是数据分析的关键步骤。

  • 缺失值处理:

    ```python

    检查缺失值

    print(df.isnull()) # 返回一个布尔 DataFrame,True 表示缺失值
    print(df.isnull().sum()) # 统计每列缺失值的数量

    删除包含缺失值的行或列

    df_dropna = df.dropna() # 删除包含缺失值的行
    df_dropna_axis1 = df.dropna(axis=1) # 删除包含缺失值的列
    df_dropna_thresh = df.dropna(thresh=2) #保留至少有2个非NaN值的行

    填充缺失值

    df_fillna = df.fillna(0) # 用 0 填充所有缺失值
    df_fillna_mean = df.fillna(df.mean()) # 用每列的均值填充缺失值
    df_ffill = df.ffill() #使用前一个非缺失值填充
    df_bfill = df.bfill() #使用后一个非缺失值填充

    ```

  • 重复值处理:

    ```python

    检查重复值

    print(df.duplicated()) # 返回一个布尔 Series,True 表示重复行

    删除重复值

    df_drop_duplicates = df.drop_duplicates() # 删除所有重复行
    df_drop_duplicates_subset = df.drop_duplicates(subset=['Name', 'Age']) #根据指定列删除重复行,保留第一个出现的重复行

    keep : {'first', 'last', False}, 默认为 'first'

    - 'first' : 删除重复项,除了第一次出现的重复项。

    - 'last' : 删除重复项,除了最后一次出现的。

    - False : 删除所有重复项。

    ```

  • 数据类型转换:

    python
    df['Age'] = df['Age'].astype(float) # 将 Age 列的数据类型转换为 float
    df['Date'] = pd.to_datetime(df['Date']) #将 Date 列的数据类型转换为 datetime

  • 数据筛选:

    ```python

    选择 Age 大于 28 的行

    df_filtered = df[df['Age'] > 28]

    选择 Age 大于 28 且 City 为 'London' 的行

    df_filtered2 = df[(df['Age'] > 28) & (df['City'] == 'London')]

    使用 .loc 和 .iloc 进行更复杂的筛选

    df_loc = df.loc[df['Age'] > 28, ['Name', 'City']] # 选择 Age 大于 28 的行的 Name 和 City 列
    ```

  • 数据排序:

    ```python

    按 Age 列升序排序

    df_sorted = df.sort_values(by='Age')

    按 Age 列降序排序

    df_sorted_desc = df.sort_values(by='Age', ascending=False)

    按多列排序

    df_sorted_multi = df.sort_values(by=['Age', 'Name'], ascending=[False, True]) # 先按 Age 降序,再按 Name 升序
    ```

  • 字符串处理:

    Pandas 的 Series 对象提供了 str 属性,可以访问各种字符串处理方法。

    ```python

    将 Name 列的所有字符串转换为大写

    df['Name'] = df['Name'].str.upper()

    查找 Name 列中包含 'li' 的字符串

    df_contains = df[df['Name'].str.contains('li')]

    更多字符串处理方法

    .str.lower(): 转换为小写

    .str.len(): 计算字符串长度

    .str.startswith(): 检查是否以指定字符串开头

    .str.endswith(): 检查是否以指定字符串结尾

    .str.replace(): 替换字符串

    .str.split(): 分割字符串

    .str.strip(): 去除字符串两端的空白字符

    .str.extract() : 使用正则表达式提取

    ```
    * 数据分组与聚合:

    ```python
    # 按 City 列分组,计算每组的平均 Age
    df_grouped = df.groupby('City')['Age'].mean()

    # 按 City 列分组,计算每组的多个统计量
    df_grouped_agg = df.groupby('City').agg({'Age': ['mean', 'min', 'max'], 'Name': 'count'})
    #还可以自定义聚合函数
    # def my_func(x):
    # return x.max() - x.min()
    # df.groupby('City').agg(my_func)

    print(df_grouped_agg)
    ```

  • 数据合并:

    ```python

    创建两个 DataFrame

    df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4]})
    df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8]})

    使用 merge() 函数进行合并 (类似 SQL 的 join)

    df_merged = pd.merge(df1, df2, on='key', how='inner') # 内连接,只保留 key 列相同的行

    how 参数:

    - 'inner': 内连接 (默认)

    - 'left': 左连接,保留左边 DataFrame 的所有行

    - 'right': 右连接,保留右边 DataFrame 的所有行

    - 'outer': 外连接,保留两个 DataFrame 的所有行

    使用 concat() 函数进行连接 (沿着行或列进行拼接)

    df_concatenated = pd.concat([df1, df2], axis=0) # 沿着行方向连接 (上下拼接)

    axis 参数:

    - 0: 沿着行方向 (默认)

    - 1: 沿着列方向 (左右拼接)

    使用join(),基于索引的合并

    df1.join(df2, how='left')

    ```

  • 数据透视表:

    ```python

    创建一个 DataFrame

    data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01', '2023-01-02'],
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [10, 15, 12, 18, 20, 25]}
    df = pd.DataFrame(data)

    创建一个数据透视表,以 Date 为行索引,Category 为列索引,计算 Value 的平均值

    pivot_table = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='mean')
    print(pivot_table)
    # aggfunc 参数: 指定聚合函数,默认为 'mean' (平均值),可以是单个函数或函数列表。
    ```

6. 数据可视化

Pandas 可以与 Matplotlib 和 Seaborn 等可视化库无缝集成,方便地进行数据可视化。

```python
import matplotlib.pyplot as plt

创建一个 DataFrame

data = {'Year': [2018, 2019, 2020, 2021, 2022],
'Sales': [100, 120, 150, 180, 200]}
df = pd.DataFrame(data)

使用 Pandas 内置的 plot() 方法绘制折线图

df.plot(x='Year', y='Sales')
plt.show()

使用 Matplotlib 自定义绘图

plt.plot(df['Year'], df['Sales'])
plt.xlabel('Year')
plt.ylabel('Sales')
plt.title('Sales Trend')
plt.grid(True)
plt.show()

可以使用Seaborn 绘制更复杂的图形

import seaborn as sns
sns.lineplot(x='Year', y='Sales', data=df)
plt.show()
```

7. 总结

本教程介绍了 Pandas 的核心概念和常用操作,包括 Series 和 DataFrame 数据结构、数据读取与写入、数据清洗与处理、数据分组与聚合、数据合并以及数据可视化。掌握这些基础知识,你就可以开始使用 Pandas 进行各种数据分析任务了。Pandas 的功能非常强大,本教程只是入门,建议进一步学习 Pandas 的高级功能,例如时间序列处理、多层索引、性能优化等,以便更高效地解决实际问题。 强烈建议阅读 Pandas 官方文档 (https://pandas.pydata.org/docs/),获取更详细的信息和示例。

THE END