Python实现多非数值列两两组合转换 适配Tableau相关矩阵构建
分类变量相关性分析长表生成方案(适配Tableau)
核心处理逻辑
- 以
Identifier列为分组键逐组处理,所有空值自动跳过,不参与配对计算 - 仅对非数值类型的分类列做无重复两两组合,不会出现Var1/Var2顺序互换的重复配对
- 输出固定三列结构:
Identifier、Var1、Var2,无需额外清洗即可导入Tableau使用
Pandas 实现代码
import pandas as pd from itertools import combinations # 替换为你的数据读取逻辑 df = pd.read_csv("your_source_data.csv") id_column = "Identifier" # 自动提取所有非数值分类列,不需要手动枚举40列的列名 category_columns = df.drop(columns=[id_column]).select_dtypes(exclude="number").columns.tolist() def get_group_pairs(group_data): # 提取当前组内所有非空分类值,自动去重 valid_values = group_data[category_columns].melt()["value"].dropna().unique() # 生成无重复两两配对,单组有效值不足2个时自动返回空 pair_list = list(combinations(sorted(valid_values), 2)) # 拼接当前组的Identifier标识 return pd.DataFrame(pair_list, columns=["Var1", "Var2"]).assign(Identifier=group_data[id_column].iloc[0]) # 分组执行后重置索引,按指定列顺序输出 final_long_table = df.groupby(id_column, group_keys=False)\ .apply(get_group_pairs)\ .reset_index(drop=True)[[id_column, "Var1", "Var2"]]
Tableau 相关矩阵搭建方法
- 导入生成的三列长表,将
Var1拖入行功能区,Var2拖入列功能区 - 将记录数拖入标记卡的「颜色」「文本」选项,单元格的数值、颜色深浅直接代表两个分类值在同一Identifier下的共现次数,可直接作为关联强度的度量
- 如果需要更严谨的分类变量相关性指标(如Cramer's V系数),可直接在Tableau中基于共现计数创建计算字段实现,无需额外在Python侧预处理
备选宽表方案
如果不需要做分类值粒度的共现分析,仅需要列级别的分类变量相关性,可跳过生成长表的步骤:
- 对所有分类列做标签编码后,直接计算Cramer's V矩阵、Kendall秩相关系数矩阵,计算时开启空值跳过参数即可
- 输出的n*n宽表可直接导入Tableau做透视展示,操作更简便
注意:宽表方案计算的是列与列之间的整体相关性,而非单元格内具体分类值的共现关系,根据分析粒度选择即可。
内容的提问来源于stack exchange,提问作者Random Person
相关产品推荐
相关产品推荐

