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
相关产品推荐
相关产品推荐

