You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中如何计算两个文本类型列的相关性并生成关联表

实现方法

你需要的是两个分类字段的交叉列联表,直接用Pandas内置的pd.crosstab()接口实现即可,这是最简洁、可读性最高的Pythonic写法,完全适配你小规模数据、一次性查询的场景,不需要额外做复杂的聚合或转换。

基础计数版(和你给出的示例结构完全一致)

直接传入行、列对应的字段即可,输出的DataFrame行索引为职业取值,列名为车型取值,每个单元格的值为同时匹配对应职业+车型的样本数量,结构和corr()的返回结果完全一致:

import pandas as pd
from random import choice

# 生成示例数据集
jobs = ['SWE', 'Data Scientist', 'Product Manager', 'Sysadmin', 'Data Engineer']
cars = ['Tesla', 'Hummer', 'Ford Focus', 'Chevy Volt', 'Toyota Tercel']
df = pd.DataFrame({
    'jobs': [choice(jobs) for _ in range(1000) ], 
    'cars': [choice(cars) for _ in range(1000) ]
})

# 生成交叉表
job_car_tab = pd.crosstab(index=df['jobs'], columns=df['cars'])
print(job_car_tab)

可选扩展:归一化占比

如果你想要类似相关系数的相对关联强度,而不是绝对计数,可以加normalize参数直接输出占比:

  • 想看每个职业下不同车型的选择占比(每行加和为1):传normalize='index'
  • 想看每个车型对应的职业分布占比(每列加和为1):传normalize='columns'
  • 想看全局占比(所有单元格加和为1):传normalize=True

示例代码:

# 输出每个职业下的车型选择占比
job_car_tab_norm = pd.crosstab(index=df['jobs'], columns=df['cars'], normalize='index')

注:用df.groupby(['jobs', 'cars']).size().unstack(fill_value=0)也能实现同样的计数效果,但crosstab是专门为分类变量交叉统计设计的接口,代码更短、参数更贴合这个场景,默认就会填充组合缺失的0值,更适合快速查询使用。如果你需要把数值替换成示例里的###类符号做简易标记,基于返回的DataFrame做简单的值映射即可,不需要额外调整统计逻辑。

内容的提问来源于stack exchange,提问作者Holden Nelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.05 16:15:45