Python Pandas 基础:数据结构与常用操作详解 – wiki大全

Python Pandas 基础:数据结构与常用操作详解

Pandas 是 Python 中一个强大且广泛使用的数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。无论是数据清洗、数据转换、数据聚合还是数据可视化,Pandas 都是数据科学家和分析师的得力助手。本文将详细介绍 Pandas 的两个核心数据结构:Series 和 DataFrame,并探讨它们的常用操作。

1. Pandas 简介

Pandas 的设计目标是让数据处理变得简单、直观。它建立在 NumPy 库之上,因此能够高效地处理大型数据集。Pandas 的主要优势在于其表格型数据结构,它使得处理结构化数据(如 CSV 文件、数据库表或 Excel 表格)变得异常便捷。

在开始之前,请确保你已经安装了 Pandas:
bash
pip install pandas

并在 Python 脚本中导入它:
python
import pandas as pd
import numpy as np # 常用作数据创建辅助

2. Pandas 核心数据结构

Pandas 提供了两种主要的数据结构:Series 和 DataFrame。

2.1 Series (一维数据结构)

Series 是一种一维带标签的数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等)。它由两部分组成:数据(values)和索引(index)。

创建 Series:

  1. 从列表创建:
    python
    s = pd.Series([1, 3, 5, np.nan, 6, 8])
    print(s)
    # 输出:
    # 0 1.0
    # 1 3.0
    # 2 5.0
    # 3 NaN
    # 4 6.0
    # 5 8.0
    # dtype: float64

    如果没有指定索引,Pandas 会自动创建一个从 0 开始的整数索引。

  2. 指定索引创建:
    python
    s_indexed = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
    print(s_indexed)
    # 输出:
    # a 10
    # b 20
    # c 30
    # dtype: int64

  3. 从字典创建:
    python
    data = {'北京': 100, '上海': 200, '广州': 150}
    s_dict = pd.Series(data)
    print(s_dict)
    # 输出:
    # 北京 100
    # 上海 200
    # 广州 150
    # dtype: int64

    字典的键会成为 Series 的索引,值成为数据。

Series 的常用属性和操作:

  • s.index: 获取索引
  • s.values: 获取数据(NumPy 数组)
  • s.dtype: 获取数据类型
  • s.name: 为 Series 命名
  • s[index]: 通过索引访问元素
  • s.head() / s.tail(): 查看前/后几行数据

2.2 DataFrame (二维数据结构)

DataFrame 是 Pandas 最常用的数据结构,它是一个二维的表格型数据结构,可以看作是 Series 对象的字典,或者带行和列标签的 NumPy 数组。它有行索引和列索引。

创建 DataFrame:

  1. 从字典创建 (字典的值可以是列表、NumPy 数组或 Series):
    python
    data = {
    '城市': ['北京', '上海', '广州', '深圳'],
    '人口': [2154, 2428, 1530, 1344],
    '面积': [16410, 6340, 7434, 1997]
    }
    df = pd.DataFrame(data)
    print(df)
    # 输出:
    # 城市 人口 面积
    # 0 北京 2154 16410
    # 1 上海 2428 6340
    # 2 广州 1530 7434
    # 3 深圳 1344 1997

  2. 指定行和列索引:
    python
    df_indexed = pd.DataFrame(data, index=['a', 'b', 'c', 'd'], columns=['城市', '人口', '面积'])
    print(df_indexed)
    # 输出:
    # 城市 人口 面积
    # a 北京 2154 16410
    # b 上海 2428 6340
    # c 广州 1530 7434
    # d 深圳 1344 1997

  3. 从 CSV 文件读取: (这是最常见的方式之一)
    python
    # 假设有一个名为 'data.csv' 的文件
    # 城市,人口,面积
    # 北京,2154,16410
    # 上海,2428,6340
    # ...
    # df_csv = pd.read_csv('data.csv')
    # print(df_csv)

DataFrame 的常用属性和操作:

  • df.index: 获取行索引
  • df.columns: 获取列索引(列名)
  • df.values: 获取数据(NumPy 数组)
  • df.shape: 获取 DataFrame 的维度 (行数, 列数)
  • df.dtypes: 获取每列的数据类型
  • df.info(): 获取 DataFrame 的摘要信息,包括每列的非空值数量和数据类型
  • df.describe(): 生成描述性统计信息,如均值、标准差、最大值、最小值等
  • df.head() / df.tail(): 查看前/后几行数据

3. DataFrame 常用操作

DataFrame 提供了丰富的数据操作功能,以下是一些最常用的:

3.1 选择和索引

  • 选择列:
    python
    print(df['城市']) # 选择单列,返回 Series
    print(df[['城市', '人口']]) # 选择多列,返回 DataFrame

  • 选择行(通过标签 loc 和位置 iloc):

    • loc (基于标签的索引):
      python
      df_indexed = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
      print(df_indexed.loc['a']) # 选择单行
      print(df_indexed.loc[['a', 'c']]) # 选择多行
      print(df_indexed.loc['a':'c', ['城市', '人口']]) # 切片选择行和列
    • iloc (基于整数位置的索引):
      python
      print(df.iloc[0]) # 选择第一行
      print(df.iloc[[0, 2]]) # 选择第一行和第三行
      print(df.iloc[0:2, 0:2]) # 切片选择行和列
  • 布尔索引 (条件选择):
    python
    print(df[df['人口'] > 2000]) # 选择人口大于2000的城市
    print(df[(df['人口'] > 2000) & (df['面积'] < 10000)]) # 组合条件

3.2 缺失数据处理

Pandas 使用 np.nan (Not a Number) 来表示缺失值。

  • 检测缺失值:
    python
    df_missing = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
    print(df_missing.isna()) # 返回布尔型 DataFrame
    print(df_missing.notna())

  • 删除缺失值:
    python
    print(df_missing.dropna()) # 删除含有任何缺失值的行
    print(df_missing.dropna(how='all')) # 删除所有值都为缺失值的行
    print(df_missing.dropna(axis=1)) # 删除含有任何缺失值的列

  • 填充缺失值:
    python
    print(df_missing.fillna(0)) # 用 0 填充所有缺失值
    print(df_missing.fillna(df_missing['B'].mean())) # 用列的均值填充
    print(df_missing.fillna(method='ffill')) # 向前填充 (用前一个有效值填充)
    print(df_missing.fillna(method='bfill')) # 向后填充 (用后一个有效值填充)

3.3 数据清洗与转换

  • 删除重复行:
    python
    df_dup = pd.DataFrame({'A': [1, 2, 2], 'B': [3, 4, 4]})
    print(df_dup.drop_duplicates())
    print(df_dup.drop_duplicates(subset=['A'])) # 基于特定列删除重复项

  • 替换值:
    python
    df_replace = pd.DataFrame({'A': [1, 2, 3], 'B': ['cat', 'dog', 'cat']})
    print(df_replace.replace('cat', 'animal'))
    print(df_replace.replace({'cat': 'kitty', 'dog': 'puppy'})) # 使用字典批量替换

  • 应用函数 (apply):
    python
    df_apply = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
    print(df_apply['A'].apply(lambda x: x * 2)) # 对 Series 应用函数
    print(df_apply.apply(np.mean, axis=0)) # 对每一列应用均值 (axis=0)
    print(df_apply.apply(np.sum, axis=1)) # 对每一行应用求和 (axis=1)

3.4 分组与聚合 (groupby)

groupby 是 Pandas 中进行数据聚合的强大工具。

“`python
df_group = pd.DataFrame({
‘城市’: [‘北京’, ‘上海’, ‘北京’, ‘上海’],
‘年份’: [2020, 2020, 2021, 2021],
‘销售额’: [100, 150, 120, 180]
})

grouped = df_group.groupby(‘城市’)
print(grouped[‘销售额’].sum()) # 按城市分组,计算销售额总和

输出:

城市

北京 220

上海 330

Name: 销售额, dtype: int64

grouped_multi = df_group.groupby([‘城市’, ‘年份’])
print(grouped_multi[‘销售额’].mean()) # 按多列分组,计算销售额均值

输出:

城市 年份

北京 2020 100.0

2021 120.0

上海 2020 150.0

2021 180.0

Name: 销售额, dtype: float64

“`

agg() 函数可以同时应用多个聚合函数:
“`python
print(grouped[‘销售额’].agg([‘sum’, ‘mean’, ‘count’]))

输出:

sum mean count

城市

北京 220 110.0 2

上海 330 165.0 2

“`

3.5 合并与连接 (merge, concat)

  • concat (拼接): 沿着某个轴将 Pandas 对象(Series 或 DataFrame)连接起来。
    “`python
    df1 = pd.DataFrame({‘A’: [1, 2], ‘B’: [3, 4]})
    df2 = pd.DataFrame({‘A’: [5, 6], ‘B’: [7, 8]})
    print(pd.concat([df1, df2])) # 默认按行拼接 (axis=0)
    # 输出:
    # A B
    # 0 1 3
    # 1 2 4
    # 0 5 7
    # 1 6 8

    df3 = pd.DataFrame({‘C’: [9, 10], ‘D’: [11, 12]})
    print(pd.concat([df1, df3], axis=1)) # 按列拼接 (axis=1)

    输出:

    A B C D

    0 1 3 9 11

    1 2 4 10 12

    “`

  • merge (合并): 类似于数据库中的 JOIN 操作,根据一个或多个键将两个 DataFrame 合并。
    “`python
    left = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’],
    ‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’]})
    right = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K4’, ‘K5’],
    ‘B’: [‘B0’, ‘B1’, ‘B4’, ‘B5’]})

    print(pd.merge(left, right, on=’key’)) # 默认内连接 (inner join)

    输出:

    key A B

    0 K0 A0 B0

    1 K1 A1 B1

    print(pd.merge(left, right, on=’key’, how=’outer’)) # 外连接 (outer join)

    输出:

    key A B

    0 K0 A0 B0

    1 K1 A1 B1

    2 K2 A2 NaN

    3 K3 A3 NaN

    4 K4 NaN B4

    5 K5 NaN B5

    “`

3.6 数据输入/输出

Pandas 支持多种文件格式的读写:

  • CSV 文件:
    python
    # df.to_csv('output.csv', index=False) # 保存 DataFrame 到 CSV 文件,不保存索引
    # df_read = pd.read_csv('output.csv') # 从 CSV 文件读取

  • Excel 文件:
    python
    # df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
    # df_read = pd.read_excel('output.xlsx', sheet_name='Sheet1')

  • JSON 文件、SQL 数据库等:
    Pandas 还支持 to_json(), read_json(), to_sql(), read_sql() 等方法。

4. 总结

本文详细介绍了 Pandas 的基础知识,包括其核心数据结构 Series 和 DataFrame 的创建方法,以及如何利用 loc, iloc, groupby, merge, concat 等常用操作进行数据选择、清洗、转换和聚合。Pandas 的强大功能远不止于此,掌握这些基础知识将为你深入探索数据分析世界打下坚实的基础。

在实际工作中,你还会遇到更多高级主题,如时间序列分析、多级索引、性能优化等。持续学习和实践是提升 Pandas 技能的关键。

滚动至顶部