如何在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
相关产品推荐
相关产品推荐

