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

如何基于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)

代码解析

  1. 分组标识生成:df['x'].str.endswith('.0')生成布尔值Series,cumsum()将布尔值转为累加整数,这样每个以.0结尾的行都会触发新分组的开始。
  2. 分组转换:通过groupby('group')按标识分组,apply中用zip()把每组的y和z值配对成元组,转成列表后,用tolist()将聚合结果转换为目标格式的嵌套列表。

该方案基于Pandas内置的高效操作,比手动循环性能提升显著,尤其适用于大规模数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:58:13