如何从Pandas DataFrame的Break列提取首尾为4的子组并修复代码问题
问题根源
- 重复输出问题:你在每一行循环的末尾都执行了
groups.append(new_group),不管当前子组有没有构建完成,所以子组有多少个元素就会重复追加多少次。 - 缺失末尾4的问题:遇到值为4的行时,你直接清空了正在构建的子组,没有先把当前4追加到前一个未完成的子组里,也没有把构建完成的子组存入结果列表。
- 额外隐患:原代码用了全局变量
groups和可变默认参数new_group = [],属于Python常见的逻辑坑,会导致多次调用函数时结果异常。
修正后代码
def extract_phrases_between_four(data): groups = [] current_group = [] for _, row in data.iterrows(): # 若实际列名是Break_Level_Annotation,替换下面的'Break'即可 break_val = row['Break'] if break_val == 4: # 已有未完成的组,说明当前4是组的结尾 if len(current_group) > 0: current_group.append(break_val) groups.append(current_group.copy()) # 以当前4作为新组的开头,满足前后组共用4的要求 current_group = [break_val] else: # 非4的元素直接追加到当前组 current_group.append(break_val) return groups
备注:如果你的
Break列值是字符串类型,把判断条件里的4改成'4'即可。
运行结果
用你提供的样例数据调用该函数,返回结果为:[[4, 1, 2, 2, 1, 4], [4, 3, 2, 1, 4], [4, 1, 1, 1, 2, 4]]
和预期输出完全一致。
内容的提问来源于stack exchange,提问作者ice queen
相关产品推荐
相关产品推荐

