5.4 交叉表 (crosstab) 5.4 Pandas 交叉表 (crosstab) 详解 交叉表是一种用于汇总分类变量之间关系的工具。在 Pandas 中, 函数提供了一种方便的方式来创建交叉表,它可以帮助我们理解两个或多个变量之间的频率分布和关联性。 5.4.1 交叉表的基本概念 交叉表,也称为列联表或双向表,是一种以表格形式展示两个或多个分类变量之间关系的汇总统计。它显示了每个变量组合的频率计数,从而揭示变量之间的潜在模式和依赖关系。 例如,我们可以使用交叉表来分析: 不同性别的人对不同产品的偏好。 不同年龄段的人对不同政治立场的支持。 不同教育水平的人的收入分布。 5.4.2 函数详解 Pandas 的 函数是创建交叉表的核心工具。
交叉表是一种用于汇总分类变量之间关系的工具。在 Pandas 中,pd.crosstab() 函数提供了一种方便的方式来创建交叉表,它可以帮助我们理解两个或多个变量之间的频率分布和关联性。
交叉表,也称为列联表或双向表,是一种以表格形式展示两个或多个分类变量之间关系的汇总统计。它显示了每个变量组合的频率计数,从而揭示变量之间的潜在模式和依赖关系。
例如,我们可以使用交叉表来分析:
不同性别的人对不同产品的偏好。
不同年龄段的人对不同政治立场的支持。
不同教育水平的人的收入分布。
pd.crosstab() 函数详解Pandas 的 pd.crosstab() 函数是创建交叉表的核心工具。其基本语法如下:
pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
参数说明:
index: 指定作为交叉表行索引的列名、数组或 Series。
columns: 指定作为交叉表列索引的列名、数组或 Series。
values: 可选参数,指定用于聚合的值。如果提供了 values 和 aggfunc,则交叉表中的单元格将包含聚合值,而不是频率计数。
rownames: 可选参数,指定行索引的名称。
colnames: 可选参数,指定列索引的名称。
aggfunc: 可选参数,指定聚合函数(例如 np.sum, np.mean, len)。 如果提供了,则必须同时提供 values。
margins: 可选参数,如果为 True,则添加行和列的总计("All" 行/列)。
dropna: 可选参数,如果为 True,则忽略所有条目都为 NaN 的列。
normalize: 可选参数,用于对结果进行标准化。 可以是 True (标准化所有值), 'index' (按行标准化), 或 'columns' (按列标准化)。
首先,我们创建一个示例 DataFrame:
import pandas as pd import numpy as np data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female', 'Male', 'Female'], 'Smoker': ['Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes'], 'City': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Los Angeles', 'Chicago', 'New York', 'Los Angeles'], 'Age': [25, 30, 35, 40, 45, 50, 55, 60], 'Sales': [100, 120, 150, 180, 200, 220, 250, 280]} df = pd.DataFrame(data) print(df)
输出:
Gender Smoker City Age Sales 0 Male Yes New York 25 100 1 Female No Los Angeles 30 120 2 Male Yes New York 35 150 3 Female Yes Chicago 40 180 4 Male No Los Angeles 45 200 5 Female No Chicago 50 220 6 Male No New York 55 250 7 Female Yes Los Angeles 60 280
1. 基本交叉表:性别 vs. 吸烟习惯
cross_table = pd.crosstab(index=df['Gender'], columns=df['Smoker']) print(cross_table)
输出:
Smoker No Yes Gender Female 2 2 Male 2 2
这个交叉表显示了不同性别的人的吸烟习惯分布。
2. 添加 margins 参数:显示总计
cross_table_margins = pd.crosstab(index=df['Gender'], columns=df['Smoker'], margins=True) print(cross_table_margins)
输出:
Smoker No Yes All Gender Female 2 2 4 Male 2 2 4 All 4 4 8
margins=True 添加了 "All" 行和列,显示了行和列的总计。
3. 使用 values 和 aggfunc 参数:计算平均年龄
cross_table_age = pd.crosstab(index=df['Gender'], columns=df['Smoker'], values=df['Age'], aggfunc='mean') print(cross_table_age)
输出:
Smoker No Yes Gender Female 40.0 50.0 Male 50.0 30.0
这里,我们使用 values=df['Age'] 和 aggfunc='mean' 来计算每个性别和吸烟习惯组合的平均年龄。
4. 使用 normalize 参数:标准化
cross_table_normalized = pd.crosstab(index=df['Gender'], columns=df['Smoker'], normalize=True) print(cross_table_normalized)
输出:
Smoker No Yes Gender Female 0.25 0.25 Male 0.25 0.25
normalize=True 将每个单元格的值除以总数,显示了每个组合的比例。 normalize='index' 按行标准化, normalize='columns' 按列标准化。
5. 多重索引交叉表:性别 + 城市 vs. 吸烟习惯
cross_table_multi = pd.crosstab(index=[df['Gender'], df['City']], columns=df['Smoker']) print(cross_table_multi)
输出:
Smoker No Yes Gender City Female Chicago 1 1 Los Angeles 1 1 Male Los Angeles 1 0 New York 1 2
这里,我们使用多个列作为行索引,创建了一个更复杂的交叉表。
6. 修改行名和列名
cross_table_named = pd.crosstab(index=df['Gender'], columns=df['Smoker'], rownames=['Sex'], colnames=['Smoking Status']) print(cross_table_named)
输出:
Smoking Status No Yes Sex Female 2 2 Male 2 2
交叉表通常与可视化工具结合使用,以更清晰地展示变量之间的关系。 例如,可以使用柱状图或热图来可视化交叉表。
1. 使用柱状图可视化
import matplotlib.pyplot as plt cross_table.plot(kind='bar', stacked=True) plt.title('Gender vs. Smoking Habit') plt.xlabel('Gender') plt.ylabel('Number of People') plt.show()
2. 使用热图可视化
import seaborn as sns sns.heatmap(cross_table, annot=True, cmap='YlGnBu') plt.title('Gender vs. Smoking Habit') plt.show()
交叉表是数据分析流程中的一个重要步骤,它可以帮助我们:
探索性数据分析 (EDA): 快速了解变量之间的关系。
特征工程: 创建新的特征,例如基于交叉表的比例或频率。
假设检验: 验证变量之间是否存在统计显著性关系。
以下是一个 Mermaid 图,展示了 pd.crosstab() 函数的基本工作原理:
图解说明:
从 DataFrame 开始。
指定 index 列和 columns 列。
判断是否指定了 values 和 aggfunc。
如果指定了,则使用指定的 values 列和 aggfunc 进行聚合。
如果没有指定,则计算每个组合的频率。
根据指定的 index 和 columns 对数据进行分组。
计算每个组的频率或聚合值。
生成交叉表。
pd.crosstab() 函数是 Pandas 中一个强大的工具,用于创建交叉表并分析分类变量之间的关系。 通过灵活地使用 index、columns、values、aggfunc 和 normalize 等参数,我们可以从数据中提取有价值的信息,并为后续的数据分析和建模提供支持。 结合可视化工具,可以更直观地展示变量之间的关系,从而更好地理解数据。