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 List | Status | Small list | Match |
|---|---|---|---|
| 10 | P | ||
| 2 | B | 2 | |
| 15 | P | ||
| 17 | F | ||
| 30 | B | 30 | |
| 47 | B | ||
| 2 | P | ||
| 45 | F |
预期结果
| Big List | Status | Small list | Match |
|---|---|---|---|
| 10 | P | ||
| 2 | B | 2 | OK |
| 15 | P | ||
| 17 | F | ||
| 30 | B | 30 | Not OK |
| 47 | B | ||
| 2 | P | ||
| 45 | F |
当前代码瓶颈
尝试用循环实现但卡在条件判断环节,初始代码如下:
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)
代码说明
- 先统一用
NaN表示空值,确保条件判断的准确性 - 先筛选出核心目标行(满足Small List非空且与Big List匹配),减少遍历次数
- 对每个目标行,查找同值的其他记录,检查是否存在符合要求的状态
- 根据检查结果直接标记对应行的
Match列
运行后即可得到预期结果,效率比全量循环更高。
内容的提问来源于stack exchange,提问作者Pouria Paimard
相关产品推荐
相关产品推荐

