如何将Pandas DataFrame转换为按标题分组的指定结构元组列表
实现方法
核心逻辑
- 按照
title列对原DataFrame做分组,分组时开启sort=False保留原数据中title的出现顺序,避免自动字典序排序打乱原有顺序 - 对每个分组内的非title字段行,逐行转换为值元组,将同组的元组收集为列表
- 最终将所有分组的(标题字符串, 元组列表)元素收集为整体列表,即为目标结构
可直接运行的代码
首先导入pandas并构造和示例一致的测试数据:
import pandas as pd # 构造示例结构的原始DataFrame df = pd.DataFrame({ "title": ["title1", "title1", "title1", "title2", "title2", "title2"], "field1": ["value11", "value21", "value31", "value1_1", "value2_1", "value3_1"], "field2": ["value12", "value22", "value32", "value1_2", "value2_2", "value3_2"], "field3": ["value13", "value23", "value33", "value1_3", "value2_3", "value3_3"], "field4": ["value14", "value24", "value34", "value1_4", "value2_4", "value3_4"], "field5": ["value15", "value25", "value35", "value1_5", "value2_5", "value3_5"], })
然后执行转换逻辑:
result = [] # 按title分组,sort=False保证分组顺序和原DataFrame一致 for title, group in df.groupby("title", sort=False): # 逐行将非title字段转为无索引的普通元组,收集为列表 row_tuple_list = list(group.drop(columns="title").itertuples(index=False, name=None)) result.append( (title, row_tuple_list) )
转换结果验证
运行上述代码后,result的结构和示例要求完全匹配:
[ ("title1", [ ("value11", "value12", "value13", "value14", "value15"), ("value21", "value22", "value23", "value24", "value25"), ("value31", "value32", "value33", "value34", "value35") ]), ("title2", [ ("value1_1", "value1_2", "value1_3", "value1_4", "value1_5"), ("value2_1", "value2_2", "value2_3", "value2_4", "value2_5"), ("value3_1", "value3_2", "value3_3", "value3_4", "value3_5") ]) ]
注意事项
- 必须给
groupby传入sort=False参数,否则pandas会默认按照title的字符串字典序对分组结果排序,在title命名为title10、title2这类场景下会打乱原数据的顺序 itertuples的name=None参数会把每行返回为普通Python元组,避免返回具名元组带来的类型差异,完全匹配需求里的元组结构
内容的提问来源于stack exchange,提问作者abhijeet
相关产品推荐
相关产品推荐

