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

如何在DataFrame中基于另一列过滤后交换指定列的部分值?

修改DataFrame指定行的列值并交换内容

原始数据

首先定义初始DataFrame:

import pandas as pd

df = pd.DataFrame([[11, 1, 1, 1, 1], [12, 2, 2, 2, 2], [12, 3, 3, 3, 3], [14, 4, 4, 4, 4]], columns=['a', 'b', 'c', 'd', 'e'])

输出结果:

a   b   c   d   e
0   11  1   1   1   1
1   12  2   2   2   2
2   12  3   3   3   3
3   14  4   4   4   4

需求

对a列值等于12的行,交换其d列的值,最终得到:

a   b   c   d  e
0   11  1   1   1  1
1   12  2   2   3  2
2   12  3   3   2  3
3   14  4   4   4  4

问题分析

你之前尝试的代码:

df[df["a"] == 12]['d'] = df[df["a"] == 12]['d'].map({2: 3, 3: 2})
df.loc[df.a == 12]["d"].replace({2: 3, 3: 2}, inplace=True)

无法修改原DataFrame的原因是:链式索引(先筛选行再选列)返回的是原DataFrame的副本,而非视图。所有修改操作都只作用在副本上,原DataFrame不会受到影响。

正确解法

方法1:用loc一次性定位修改(推荐)

通过loc同时指定行条件和列名,直接对原DataFrame的目标区域赋值:

# 方式1:使用map替换
df.loc[df['a'] == 12, 'd'] = df.loc[df['a'] == 12, 'd'].map({2: 3, 3: 2})

# 方式2:使用replace替换
df.loc[df['a'] == 12, 'd'] = df.loc[df['a'] == 12, 'd'].replace({2: 3, 3: 2})

方法2:直接交换指定行的值

如果确定a=12的行只有固定两行,可以直接提取索引后交换:

# 获取a=12的行索引列表
target_idx = df[df['a'] == 12].index
# 交换两行d列的值
df.loc[target_idx[0], 'd'], df.loc[target_idx[1], 'd'] = df.loc[target_idx[1], 'd'], df.loc[target_idx[0], 'd']

运行任意一种方法后,都能得到符合需求的DataFrame结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:50:26