如何基于Pandas DataFrame列值生成嵌套元组列表?
问题背景
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'x':['ab_c_1.0.0','ab_c_1.0.1','ab_c_1.0.2','ab_c_1.1.0','ab_c_1.1.1','ab_c_1.2.0','ab_c_1.3.0','ab_c_1.3.1'], 'y':['a','b','c','d','e','f','g','h'], 'z':['i','j','k','l','m','n','o','p']})
其结构为:
x y z 0 ab_c_1.0.0 a i 1 ab_c_1.0.1 b j 2 ab_c_1.0.2 c k 3 ab_c_1.1.0 d l 4 ab_c_1.1.1 e m 5 ab_c_1.2.0 f n 6 ab_c_1.3.0 g o 7 ab_c_1.3.1 h p
需要生成指定格式的嵌套元组列表:
[[('a', 'i'), ('b', 'j'), ('c', 'k')], [('d', 'l'), ('e', 'm')], [('f', 'n')], [('g', 'o'), ('h', 'p')]]
此前尝试遍历df['x']判断是否以.0结尾,结合df.values.tolist()处理,但多次迭代效率低下,且无法通过固定切片/滑动窗口分割DataFrame,仅能通过检查x列字符串末尾是否为0分组,寻求高效方案。
高效解决方案
利用Pandas的向量化操作生成分组标识,再通过分组聚合完成转换,全程避免低效循环:
# 生成分组标识:每遇到x以.0结尾的行,分组序号递增 df['group'] = df['x'].str.endswith('.0').cumsum() # 按分组聚合,将每组的y、z值配对成元组,再整理为目标嵌套列表 result = (df.groupby('group') .apply(lambda group: list(zip(group['y'], group['z']))) .tolist()) print(result)
代码解析
- 分组标识生成:
df['x'].str.endswith('.0')生成布尔值Series,cumsum()将布尔值转为累加整数,这样每个以.0结尾的行都会触发新分组的开始。 - 分组转换:通过
groupby('group')按标识分组,apply中用zip()把每组的y和z值配对成元组,转成列表后,用tolist()将聚合结果转换为目标格式的嵌套列表。
该方案基于Pandas内置的高效操作,比手动循环性能提升显著,尤其适用于大规模数据集。
内容的提问来源于stack exchange,提问作者doine
相关产品推荐
相关产品推荐

