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
相关产品推荐
相关产品推荐

