如何按前置关联值提取DataFrame行?Pandas匹配问题修复
问题分析与修正方案
你的代码逻辑存在两处关键缺陷,导致无法得到预期结果:
- 判断时机错误:检查
source[i+1] in targetlist时,当前行i的target还未被加入列表,因此第三行(索引2)的target=41还没存入targetlist,无法检测到下一行source=41属于之前的目标值; - 提前终止循环:一旦某一行不满足条件就直接
break,导致后续符合条件的行(第四行)被漏掉——第四行的source=41其实是第三行的target,但第三行未被加入列表,自然无法触发第四行的判断。
方案1:修正原生Python循环逻辑
调整判断逻辑,改为验证当前行是否符合延续条件(与上一行source相同,或当前source在已保留的target集合中),而非提前判断下一行:
source = [40, 40, 40, 41, 42, 50, 51, 101] target = [76, 77, 41, 79, 80, 51, 90, 102] sourcelist = [] targetlist = [] # 先加入第一行作为起始 if source: sourcelist.append(source[0]) targetlist.append(target[0]) # 从第二行开始遍历 for i in range(1, len(source)): current_source = source[i] # 满足条件则加入列表:和上一行source相同,或当前source在已保留的target中 if current_source == sourcelist[-1] or current_source in targetlist: sourcelist.append(current_source) targetlist.append(target[i]) else: break print(sourcelist) # 输出: [40, 40, 40, 41] print(targetlist) # 输出: [76, 77, 41, 79]
方案2:基于Pandas的实现(更适合批量数据)
既然你提到已构建Pandas DataFrame,可以用更高效的逻辑处理:
import pandas as pd source = [40, 40, 40, 41, 42, 50, 51, 101] target = [76, 77, 41, 79, 80, 51, 90, 102] df = pd.DataFrame({"source": source, "target": target}) # 初始化保留标记和已出现的target集合 keep = [True] * len(df) seen_targets = {df.iloc[0]["target"]} for i in range(1, len(df)): current_source = df.iloc[i]["source"] # 验证当前行是否符合延续条件 if current_source == df.iloc[i-1]["source"] or current_source in seen_targets: keep[i] = True seen_targets.add(df.iloc[i]["target"]) else: # 终止后续所有行的保留 keep[i:] = [False] * (len(df) - i) break # 提取结果 result_df = df[keep] print(result_df["source"].tolist()) # 输出: [40, 40, 40, 41] print(result_df["target"].tolist()) # 输出: [76, 77, 41, 79]
内容的提问来源于stack exchange,提问作者Panagiotis V
相关产品推荐
相关产品推荐

