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

Pandas DataFrame按index分组重启for循环实现sliding window遍历

问题说明

现有如下结构的pandas DataFrame:

index turns conv
0      0  utt1  yes
1      1  utt2  yes
2      2  utt3   no
3      3  utt4  yes
4      0  utt5  yes
5      1  utt6   no
6      2  utt7  yes

需要实现的逻辑:

  • 打印turns列相邻两个元素,以及后一个元素对应的conv列值
  • 遍历到index列值为0的行时,判定为新序列的起点,不能将前一个序列的末尾行和新序列的起始行配对(比如避免utt4和utt5被错误配对)
  • 不同序列的输出之间用空行分隔

原有错误实现代码:

for i in range(len(df['turns'])):
    if(i+1==len(df['turns'])):
      break;
    else:
      print(df['turns'][i], df['turns'][i+1], df['conv'][i+1]) 

原有错误输出:

utt1 utt2 yes
utt2 utt3 no
utt3 utt4 yes
utt4 utt5 yes
utt5 utt6 no
utt6 utt7 yes

期望正确输出:

utt1 utt2 yes
utt2 utt3 no
utt3 utt4 yes

utt5 utt6 no
utt6 utt7 yes

该需求本质是按序列边界做分组滑动窗口配对。

实现方法

方法1:边界判断直接遍历

先标记所有新序列的起始行位置,遍历过程中遇到跨边界的配对直接跳过,同时打印空行做分隔:

# 提取所有新序列的起始行索引
seq_start_index = df[df['index'] == 0].index.tolist()

for i in range(len(df) - 1):
    # 下一行是新序列起点时,跳过配对,打印空行
    if (i + 1) in seq_start_index:
        print()
        continue
    # 输出同序列内的相邻配对
    print(df.loc[i, 'turns'], df.loc[i+1, 'turns'], df.loc[i+1, 'conv'])

方法2:分组后组内滑动(可读性更强)

先给每个独立序列分配唯一ID,按组遍历后在组内做相邻配对,逻辑更易维护扩展:

# 每遇到index=0的行,序列ID自增,生成分组标识
df['seq_id'] = (df['index'] == 0).cumsum()

for _, group in df.groupby('seq_id'):
    # 组内遍历生成相邻配对
    for i in range(len(group) - 1):
        cur = group.iloc[i]
        next_item = group.iloc[i+1]
        print(cur['turns'], next_item['turns'], next_item['conv'])
    # 组间打印空行分隔
    print()

两种方法都能得到预期输出,第二种分组写法更贴合数据逻辑,后续如果需要给每个序列增加其他计算逻辑也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:54:20