Pandas中制作列联表的3种简单方法

2025年1月4日 | 阅读 4 分钟

Python 是一种高级、解释型、动态类型的语言,以其简洁性和可读性而闻名。它使用缩进来定义代码块,从而提高了清晰度。Python 支持多种编程范式,包括过程式、面向对象和函数式编程。其广泛的流行库和活跃的社区使其能够胜任各种应用,从 Web 开发到数据分析。

什么是 Pandas?

Pandas 是一个强大的 Python 库,用于数据操作和分析,提供了 Series(一维)和 DataFrame(二维)等数据结构来处理结构化数据。它支持数据清理、合并、重塑和聚合等操作。Pandas 在处理缺失数据、按标签对齐数据以及执行复杂的分组操作方面表现出色,这使其成为数据科学和机器学习任务的关键工具。

Pandas 的主要特点

以下是 Pandas 的一些主要功能:

  • 数据结构
    • Series:一维标记数组。
    • DataFrame:具有可能包含不同类型列的二维标记数据结构。
    • Panel:在 DataFrame 的 MultiIndex 中已弃用。
  • 数据处理
    • 数据对齐和缺失数据处理。
    • 数据集合的重塑和透视。
    • 大型数据集的基于标签的切片、花式索引和子集操作。
    • 数据与用于处理时间序列数据的工具集成。
  • 文件 I/O:在内存中的数据结构和各种文件格式(例如 CSV、Excel、SQL、HDF5)之间读写数据。

理解交叉制表 (Crosstabs)

Pandas 中的交叉制表(cross-tabulations)通过创建以一个变量作为行、另一个变量作为列的矩阵来汇总一个或多个变量之间的关系。

主要特点

以下是使用 Pandas 交叉制表数据的一些关键功能:

  • 频率计数:默认情况下,`pd.crosstab()` 会计算所需变量的唯一组合的频率计数。
  • 聚合函数:您可以使用 `aggfunc` 参数指定不同的聚合函数来汇总数据,例如均值、总和或其他 NumPy 函数。
  • 标准化:标准化允许您将频率显示为比例。您可以使用“normalize”参数对索引、列或整个表进行标准化。
  • 处理缺失值:您可以使用 `fill_value` 参数指定一个值来填充交叉制表中的缺失值。
  • 边距和汇总:`margins` 参数添加行和列总计,这有助于理解数据的分布。
  • 多级索引:交叉制表支持多级(分层)索引,允许对涉及多个变量的更复杂的汇总。

交叉制表的一些优点

以下是交叉制表方法的优点列表:

  1. 简易频率计数:快速计算分类变量特定组合的计数。
  2. 聚合灵活性:支持自定义聚合函数,如均值、总和等。
  3. 标准化:轻松标准化数据以显示比例而非原始计数。
  4. 处理缺失值:可以选择用特定默认值填充缺失值。
  5. 边距总计:可以添加行和列总计以获得完整的数据摘要。
  6. 多级索引:支持涉及多个变量的复杂交叉制表。
  7. DataFrame 输出:生成 DataFrame 格式的结果,便于进一步分析和操作。

现在让我们讨论一些在 Pandas 中进行交叉制表的简单方法。

Pandas 中一些简单的交叉制表方法

在接下来的部分,我们将讨论在 Pandas 中进行交叉制表的一些最简单的方法。其中一些列在下面:

  • 使用 `pd.crosstab()` 方法进行交叉制表
  • 使用 `groupby()` 和 `unstack()` 方法进行交叉制表
  • 使用 `pivot_table()` 方法进行交叉制表

让我们通过示例来理解这些方法。

方法 1:使用 `pd.crosstab()`

`pd.crosstab()` 计算两个(或多个)变量的简单交叉制表。默认情况下,它会计算每个变量组合的频率。

示例

输出

 
Type      X  Y
Category      
A         2  1
B         2  1   

说明

  • `pd.crosstab(df['Category'], df['Type'])`:在“Category”和“Type”列之间创建交叉制表。
  • 结果显示了“Category”和“Type”每个组合的出现次数。

方法 2:使用 `groupby()` 和 `unstack()`

使用 `groupby()` 按指定列对数据进行分组,然后使用 `unstack()` 将结果 Series 重塑为 DataFrame。

示例

输出

 
Type      X  Y
Category      
A         2  1
B         2  1   

说明

  • `df.groupby(['Category', 'Type']).size()`:按“Category”和“Type”对 DataFrame 进行分组并计算出现次数。
  • `.unstack(fill_value=0)`:将 Series 重塑为 DataFrame,以“Category”作为索引,“Type”作为列,并将缺失值填充为 0。

方法 3:使用 `pivot_table()`

`pivot_table()` 可用于创建透视表,这是一种更通用的交叉制表形式,允许使用不同的聚合函数。

示例

输出

 
Empty DataFrame
Columns: []
Index: [A, B]   

说明

  • `df.pivot_table(index='Category', columns='Type', values='Category', aggfunc='count', fill_value=0)`:创建以“Category”作为索引,“Type”作为列的透视表。它计算每个组合的出现次数(使用 `aggfunc='count'`),并将缺失值填充为 0。