如何高效将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)
步骤解析
stack():把原DataFrame的列标签转为内层行索引,将宽表转为长表,自动收拢非空值的行。reset_index():把多层索引拆成普通列,此时默认列名为level_0、level_1、0。- 列重命名:直接修改列名对应目标格式的三个字段。
- 过滤空值:原数据中的空字符串会被
stack()保留,需要用布尔索引筛掉。 - 重置行索引:去除之前的索引,生成从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
相关产品推荐
相关产品推荐

