如何使用pandas从DataFrame生成类相关矩阵格式的变量计数表
可以直接用pandas实现这个转换,不需要额外依赖其他库,核心逻辑是先搭建全0的矩阵框架,再把对应count值填充到匹配的行列位置即可。
实现逻辑
- 拆分原始数据
variable列的所有取值,提取全部独立变量,按照目标格式要求指定行、列的排列顺序 - 用指定的行、列索引初始化一个数值全为0的整型DataFrame方阵
- 遍历原始数据集每一行,拆分
variable字段做对应赋值:- 字段为单个变量时,把count值填到该变量对应行列的对角线位置
- 字段为逗号分隔的两个变量时,把count值填到两个变量互为行、列的交叉位置
可直接运行的代码
import pandas as pd import numpy as np # 原始输入数据集 df = pd.DataFrame({ 'variable': ['a,x', 'a', 'a,y'], 'count': [20, 100, 40] }) # 对齐示例输出的行列顺序 row_order = ['a', 'x', 'y'] col_order = ['y', 'x', 'a'] # 初始化全0矩阵 result = pd.DataFrame( np.zeros((len(row_order), len(col_order)), dtype=int), index=row_order, columns=col_order ) # 遍历填充计数值 for _, row in df.iterrows(): var_split = row['variable'].split(',') cnt = row['count'] if len(var_split) == 1: # 单变量填充对角线位置 v = var_split[0] result.loc[v, v] = cnt else: # 双变量填充两个交叉位置 v1, v2 = var_split result.loc[v1, v2] = cnt result.loc[v2, v1] = cnt print(result)
输出结果
运行后得到的矩阵数值和要求完全匹配,pandas默认把列名打印在顶部,如果需要和示例一样把列名放在底部,调整打印格式即可:
y x a a 40 20 100 x 0 0 20 y 0 0 40
后续如果新增变量、新增变量组合,这套逻辑不需要修改即可自动适配,没有对应关系的变量交叉位置会默认保持0值。
内容的提问来源于stack exchange,提问作者sp0392
相关产品推荐
相关产品推荐

