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

如何按前置关联值提取DataFrame行?Pandas匹配问题修复

问题分析与修正方案

你的代码逻辑存在两处关键缺陷,导致无法得到预期结果:

  1. 判断时机错误:检查source[i+1] in targetlist时,当前行i的target还未被加入列表,因此第三行(索引2)的target=41还没存入targetlist,无法检测到下一行source=41属于之前的目标值;
  2. 提前终止循环:一旦某一行不满足条件就直接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:07:12