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

基于值列模式在两个pandas DataFrame间交换对应行

Pandas 跨DataFrame按规则交换指定列行值

问题场景

现有两个结构完全一致的DataFrame,两表的values列都存在两类固定模式的数值,需要按规则跨表交换对应行的values取值,最终让第一个表保留第一类值、第二个表保留第二类值。
初始测试数据如下:

df1 = {'idx': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
       'values': [20, 1000, 10001, 21, 1000, 1002, 22, 1003, 1007,23]}
df2 = {'idx': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
       'values': [1000, 21, 22, 1000, 22, 23, 1000, 20, 21, 1000]}

预期输出结果:

df_expected1 = {'idx': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
       'values': [20, 21, 22, 21, 22, 23, 22, 20, 21,23]}

df_expected2 = {'idx': [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
       'values': [1000, 1000, 10001, 1000, 1000, 1002, 1000, 1003, 1007, 1000]}

实现方案

核心逻辑是先定位需要交换的行位置,再直接做批量值交换,不需要逐行循环,性能更好:

  • 首先区分两类数值:示例里第一类值(要留在df1)都是小于100的数,第二类值(要留在df2)都是大于等于1000的数,用阈值就可以快速区分
  • 生成交换掩码:标记所有「df1当前存的是第二类值、df2当前存的是第一类值」的行
  • 对掩码命中的行,批量交换两个表的values取值,全程保留idx列不变

完整可运行代码:

import pandas as pd

# 初始化DataFrame
df1 = pd.DataFrame({
    'idx': [1,2,3,4,5,6,7,8,9,10],
    'values': [20, 1000, 10001, 21, 1000, 1002, 22, 1003, 1007,23]
})
df2 = pd.DataFrame({
    'idx': [1,2,3,4,5,6,7,8,9,10],
    'values': [1000, 21, 22, 1000, 22, 23, 1000, 20, 21, 1000]
})

# 两类值的分界阈值,根据实际业务调整即可
split_threshold = 500

# 定位需要交换的行
need_swap = (df1['values'] > split_threshold) & (df2['values'] < split_threshold)

# 批量交换值
df1.loc[need_swap, 'values'], df2.loc[need_swap, 'values'] = df2.loc[need_swap, 'values'], df1.loc[need_swap, 'values']

说明

如果实际场景中两类值没有明确的大小分界,可以把阈值判断替换成自定义的规则,比如判断值是否属于指定集合、是否匹配特定正则等,核心的批量交换逻辑不需要修改。运行后得到的结果和给出的预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:03:41