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

如何高效将DataFrame(矩阵)转换为三元组格式?

高效转换Pandas DataFrame为三元组格式

问题说明

现有如下示例DataFrame:

import pandas as pd
import datetime

start = datetime.datetime.now()
print('Starting time,'+str(start))
dict1 = {'id':['person1','person2','person3'], 
         'person1':['A','','', ], 
         'person2':['B','E',''], 
         'person3':['C','F','G',], }
demo = pd.DataFrame(dict1)
demo.set_index(["id"], inplace=True)

对应的DataFrame结构:

person1 person2 person3 
person1    A       B       C
person2            E       F
person3                    G

需要将其转换为如下三元组格式,且要避免循环遍历的低效问题:

target_1    target_2    target
0   person1     person1       A
1   person1     person2       B
2   person1     person3       C
3   person2     person1       E
4   person2     person2       F
5   person3     person3       G

高效实现方案

用Pandas的向量化操作(stack()方法)来处理,比循环快得多,代码如下:

# 堆叠列到行索引,生成多层索引的Series
stacked_df = demo.stack()

# 重置索引,将多层索引转为普通列
result = stacked_df.reset_index()

# 重命名列匹配目标格式
result.columns = ['target_1', 'target_2', 'target']

# 过滤掉原数据中的空字符串
result = result[result['target'] != '']

# 重置行索引为连续数字
result = result.reset_index(drop=True)

print(result)

步骤解析

  1. stack():把原DataFrame的列标签转为内层行索引,将宽表转为长表,自动收拢非空值的行。
  2. reset_index():把多层索引拆成普通列,此时默认列名为level_0、level_1、0。
  3. 列重命名:直接修改列名对应目标格式的三个字段。
  4. 过滤空值:原数据中的空字符串会被stack()保留,需要用布尔索引筛掉。
  5. 重置行索引:去除之前的索引,生成从0开始的连续索引。

最终输出

运行代码后得到的结果完全符合需求:

target_1 target_2 target
0  person1  person1      A
1  person1  person2      B
2  person1  person3      C
3  person2  person2      E
4  person2  person3      F
5  person3  person3      G

内容的提问来源于stack exchange,提问作者Manfred L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:40:10