如何基于带MultiIndex的距离矩阵直接构建Pandas DataFrame
用Pandas多级索引DataFrame直接生成跨类别标签对的距离表
其实你完全不用写那些手动拼接索引的“hacky”代码,Pandas内置的stack()方法就能完美解决你的需求,直接基于你已经构建好的distances_matrix生成目标DataFrame,步骤超简单:
核心代码实现
# 直接从distances_matrix转换 distances_df = distances_matrix.stack([0, 1]).reset_index() # 给列起个清晰的名字 distances_df.columns = ['F', 'Ftags', 'P', 'Ptags', 'distance'] print(distances_df)
运行结果
F Ftags P Ptags distance 0 F1 tag1f1 B1 tag1b1 4.0 1 F1 tag1f1 B2 tag1b2 16.0 2 F1 tag1f1 B2 tag2b2 64.0 3 F2 tag1f2 B1 tag1b1 16.0 4 F2 tag1f2 B2 tag1b2 36.0 5 F2 tag1f2 B2 tag2b2 100.0
步骤解释
stack([0,1]):这里的[0,1]指定要把列的前两个层级(P和Ptags)从列索引“堆叠”到行索引里,和原来的行索引(F、Ftags)合并成一个4级的MultiIndex,此时数据变成一个Series,索引是每一对跨类别标签组合,值就是对应的距离。reset_index():把这个多级索引拆成普通的列,方便后续处理。- 重命名列:默认的列名是
level_0、level_1这类,改成有意义的名字让结果更直观。
后续分组需求适配
你提到最终需要按类别分组,用这个方法生成的DataFrame直接用groupby()就能轻松实现,比如:
- 按F类别分组:
distances_df.groupby('F') - 按F和P的组合类别分组:
distances_df.groupby(['F', 'P'])
这种方法完全依赖Pandas的原生操作,比手动处理笛卡尔积和索引拼接简洁太多,可读性和可维护性都强很多~
内容的提问来源于stack exchange,提问作者Mr_and_Mrs_D
相关产品推荐
相关产品推荐

