基于值列模式在两个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
相关产品推荐
相关产品推荐

