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

Python Pandas DataFrame多条件匹配标记实现求助

Pandas DataFrame条件匹配逻辑实现求助

需求说明

需基于DataFrame的"Big List"、"Small List"和"Status"列实现以下条件匹配逻辑:

  • 在"Big List"列中查找值
  • 将匹配值与对应行"Small List"列的值对比
  • 若匹配,再次在"Big List"列中查找该值
  • 将新匹配值对应行的"Status"列值进行对比
  • 若"Status"列值为"B",再次在"Big List"列中查找初始匹配值的重复项
  • 若重复项的状态为"P"或"F",则在对应行的"Match"列标记为"OK",否则标记为"Not OK"

简化数据集示例

Big ListStatusSmall listMatch
10P
2B2
15P
17F
30B30
47B
2P
45F

预期结果

Big ListStatusSmall listMatch
10P
2B2OK
15P
17F
30B30Not OK
47B
2P
45F

当前代码瓶颈

尝试用循环实现但卡在条件判断环节,初始代码如下:

import pandas as pd
import numpy as np

data = {'Big List': [10, 2, 15, 17, 30, 40, 30, 47, 50,55], 
        'Status':['P','B','P','F','B','B','P','P','B','F'],
        'Small List': [17, 15, 42, 31, 45, 30]}

# 补充df初始化
df = pd.DataFrame(data)
df['Small List'] = df['Small List'].fillna(np.nan)

# Loop through rows and compare values
for index, row in df.iterrows():
    if row['Small List'] in df['Big List']:
        # Sort the row in the "Small List" column
        # Stuck here
    else:
        # Add value to "Not Matched" column
        # Stuck here

print(df)

解决方案

避免用iterrows遍历所有行(效率低),改用Pandas向量化操作+目标行遍历实现:

import pandas as pd
import numpy as np

# 对齐示例格式初始化数据集,补充空值
data = {
    'Big List': [10, 2, 15, 17, 30, 47, 2, 45],
    'Status': ['P', 'B', 'P', 'F', 'B', 'B', 'P', 'F'],
    'Small List': [np.nan, 2, np.nan, np.nan, 30, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data)
df['Match'] = ''

# 筛选出Small List非空且与当前行Big List匹配的目标行
target_rows = df[df['Small List'].notna() & (df['Small List'] == df['Big List'])]

# 对每个目标行执行后续判断
for idx, row in target_rows.iterrows():
    current_value = row['Big List']
    # 获取所有同Big List值的其他行(排除当前行)
    same_value_records = df[(df['Big List'] == current_value) & (df.index != idx)]
    # 检查是否存在状态为P/F的记录
    has_valid_status = same_value_records['Status'].isin(['P', 'F']).any()
    # 标记Match列
    df.loc[idx, 'Match'] = 'OK' if has_valid_status else 'Not OK'

print(df)

代码说明

  1. 先统一用NaN表示空值,确保条件判断的准确性
  2. 先筛选出核心目标行(满足Small List非空且与Big List匹配),减少遍历次数
  3. 对每个目标行,查找同值的其他记录,检查是否存在符合要求的状态
  4. 根据检查结果直接标记对应行的Match列

运行后即可得到预期结果,效率比全量循环更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:32:02