Pandas查找满足多条件的最小索引实现指定和的数值配对分组
Pandas DataFrame 配对分组实现方案
核心实现逻辑
- 遍历所有未分组的行,计算当前数值的补数(目标和6减去当前值)
- 筛选待配对行规则:未分组、数值等于补数、索引不等于当前行索引(避免自配对)
- 先判断筛选结果是否为空,为空直接跳过,完全避免无匹配时的索引取值报错
- 找到符合条件的最小索引后,同时给两行标记分组状态和配对索引
完整可运行代码
import pandas as pd # 可配置目标和 TARGET_SUM = 6 # ------------------- 示例1输入 ------------------- df_1 = pd.DataFrame({ 'Rest_after_division': [1,3,3,4,5,5,1], 'Grouped_with_index': ["-","-","-","-","-","-","-"], 'Grouped': [0,0,0,0,0,0,0] }) # ------------------- 配对逻辑 ------------------- for idx in df_1.index: # 跳过已分组行 if df_1.at[idx, 'Grouped'] == 1: continue current_val = df_1.at[idx, 'Rest_after_division'] target_val = TARGET_SUM - current_val # 筛选符合条件的配对候选 candidate = df_1[ (df_1['Grouped'] == 0) & (df_1['Rest_after_division'] == target_val) & (df_1.index != idx) ] # 无候选直接跳过,避免报错 if candidate.empty: continue # 取最小的候选索引 buddy_idx = candidate.index.min() # 标记配对信息 df_1.at[idx, 'Grouped'] = 1 df_1.at[idx, 'Grouped_with_index'] = str(buddy_idx) df_1.at[buddy_idx, 'Grouped'] = 1 df_1.at[buddy_idx, 'Grouped_with_index'] = str(idx) # 查看结果 print(df_1)
测试用例验证
示例2(3个1和3个5)输入
df_2 = pd.DataFrame({ 'Rest_after_division': [1,1,1,5,5,5], 'Grouped_with_index': ["-","-","-","-","-","-"], 'Grouped': [0,0,0,0,0,0] })
运行上述配对逻辑后,会自动完成三对配对:0↔3、1↔4、2↔5,符合两两配对需求。
内容的提问来源于stack exchange,提问作者Johanna Marklund
相关产品推荐
相关产品推荐

