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

Pandas按cond列区间条件在两个DataFrame间交换行的实现方法

Pandas按cond列区间归集两个DataFrame行的实现方法

注:你给出的预期结果存在列名笔误,重复定义了col2列、缺失了col3列,以下实现会修正该笔误,保证列结构和原始DataFrame完全一致,且行顺序和预期结果完全匹配。

实现思路

  • 两个DataFrame的行是按索引位置一一对应的,归集时需要按原始行位置逐行判断归属,不能直接拼接后筛选,否则行顺序会和预期不符
  • 给两个DataFrame添加临时排序键:df1的行排序键设为索引值*2,df2的行排序键设为索引值*2+1,保证拼接后顺序为「df1第i行、df2第i行、df1第i+1行、df2第i+1行」,和逐行遍历的顺序一致
  • 拼接后按临时排序键排序,再用布尔索引分别筛选cond列落在目标区间的行:
    • 5000±100区间为cond值在4900到5100之间
    • 6000±100区间为cond值在5900到6100之间
  • 筛选完成后删除临时排序列,重置索引即可得到最终结果。

完整实现代码

import pandas as pd

# 构造原始示例数据
df1 = pd.DataFrame({
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'col2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'col3': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'cond': [5000, 6000, 6001, 5000, 6002, 6003, 5000, 6004, 6005, 5001]
})
df2 = pd.DataFrame({
    'col1': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    'col2': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    'col3': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    'cond': [6000, 5000, 5001, 6000, 5002, 5003, 6000, 5004, 5005, 6001]
})

# 添加临时排序键,保证逐行交替的顺序
df1['_sort_key'] = df1.index * 2
df2['_sort_key'] = df2.index * 2 + 1

# 拼接并按排序键排序
combined = pd.concat([df1, df2]).sort_values('_sort_key').reset_index(drop=True)

# 按区间筛选归集
df_expected1 = combined[combined['cond'].between(4900, 5100)].drop(columns=['_sort_key']).reset_index(drop=True)
df_expected2 = combined[combined['cond'].between(5900, 6100)].drop(columns=['_sort_key']).reset_index(drop=True)

结果验证

运行代码后打印两个结果:

  • df_expected1的col1列值为[1, 9, 8, 4, 6, 5, 7, 3, 2, 10],cond列值为[5000, 5000, 5001, 5000, 5002, 5003, 5000, 5004, 5005, 5001]
  • df_expected2的col1列值为[10, 2, 3, 7, 5, 6, 4, 8, 9, 1],cond列值为[6000, 6000, 6001, 6000, 6002, 6003, 6000, 6004, 6005, 6001]
    和需求给出的预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:45:59