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之间
- 5000±100区间为
- 筛选完成后删除临时排序列,重置索引即可得到最终结果。
完整实现代码
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
相关产品推荐
相关产品推荐

