Python实现:遍历DataFrame元组列并按分组循环赋值
问题描述
需要遍历DataFrame中以字符串形式存储的元组类型列,同一Group分组内的ID按顺序循环选取元组中的元素:第1个ID选取元组第1个元素,第2个ID选取元组第2个元素,后续ID循环往复;当Group分组变更时,对新分组重复该逻辑。也可先拆分至新DataFrame后再合并。
初始代码
import pandas as pd df = pd.DataFrame({'ID':[1,2,3,4,5,6], 'Group':["('Cat','Dog')", "('Cat','Dog')", "('Cat','Dog')", "('Cat','Dog')", "('Bird','Dog')", "('Bird','Dog')", ] })
初始数据
| ID | Group |
|---|---|
| 1 | ('Cat', 'Dog') |
| 2 | ('Cat', 'Dog') |
| 3 | ('Cat', 'Dog') |
| 4 | ('Cat', 'Dog') |
| 5 | ('Bird', 'Dog') |
| 6 | ('Bird', 'Dog') |
期望结果
| ID | Group |
|---|---|
| 1 | Cat |
| 2 | Dog |
| 3 | Cat |
| 4 | Dog |
| 5 | Bird |
| 6 | Dog |
解决方案
可以通过以下步骤实现需求:
- 将字符串形式的元组转换为实际可迭代对象:用
ast.literal_eval解析字符串,转成真实元组,避免eval的安全风险。 - 分组生成组内序号:按原始
Group字符串分组,给每组内的行从0开始生成连续序号。 - 循环选取元素:用组内序号对元组长度取模,得到元素索引,实现循环选取。
完整代码如下:
import pandas as pd import ast # 初始数据 df = pd.DataFrame({'ID':[1,2,3,4,5,6], 'Group':["('Cat','Dog')", "('Cat','Dog')", "('Cat','Dog')", "('Cat','Dog')", "('Bird','Dog')", "('Bird','Dog')", ] }) # 解析字符串元组为实际元组 df['parsed_group'] = df['Group'].apply(ast.literal_eval) # 分组后生成组内序号 df['group_idx'] = df.groupby('Group').cumcount() # 按序号循环选取元组元素 df['Group'] = df.apply(lambda row: row['parsed_group'][row['group_idx'] % len(row['parsed_group'])], axis=1) # 清理临时列 df = df.drop(['parsed_group', 'group_idx'], axis=1) print(df)
运行后输出结果:
ID Group 0 1 Cat 1 2 Dog 2 3 Cat 3 4 Dog 4 5 Bird 5 6 Dog
补充说明
- 代码适配不同长度的元组,无论分组内元组是2个还是更多元素,取模操作都会自动循环选取。
- 无需拆分合并DataFrame,直接在原数据上处理,效率更高。
内容的提问来源于stack exchange,提问作者Shell Shock
相关产品推荐
相关产品推荐

