Python 将指定列的一个值替换为另一个值

Python 将指定列的一个值替换为另一个值,python,pandas,apply,Python,Pandas,Apply,我需要对数据帧中的列子集应用一个函数。考虑下面的玩具例子: pdf = pd.DataFrame({'a' : [1, 2, 3], 'b' : [2, 3, 4], 'c' : [5, 6, 7]}) arb_cols = ['a', 'b'] 我想做的是: [df[c] = df[c].apply(lambda x : 99 if x == 2 else x) for c in arb_cols] 但这是糟糕的语法。不使用for循环是否可以完成这样的任务?不要使用pd.Series。如果

我需要对数据帧中的列子集应用一个函数。考虑下面的玩具例子:

pdf = pd.DataFrame({'a' : [1, 2, 3], 'b' : [2, 3, 4], 'c' : [5, 6, 7]})
arb_cols = ['a', 'b']
我想做的是:

[df[c] = df[c].apply(lambda x : 99 if x == 2 else x) for c in arb_cols]

但这是糟糕的语法。不使用for循环是否可以完成这样的任务?

不要使用
pd.Series。如果可以使用矢量化函数,请应用

例如,对于较大的数据帧,即使存在外部循环,下面的方法也应该是有效的:

for col in arb_cols:
    pdf.loc[pdf[col] == 2, col] = 99
另一个选项是使用
pd.DataFrame.replace

pdf[arb_cols] = pdf[arb_cols].replace(2, 99)
另一种选择是使用
numpy。其中

import numpy as np
pdf[arb_cols] = np.where(pdf[arb_cols] == 2, 99, pdf[arb_cols])
带面具

pdf.mask(pdf.loc[:,arb_cols]==2,99).assign(c=pdf.c)
Out[1190]: 
    a   b  c
0   1  99  5
1  99   3  6
2   3   4  7
或与指定

pdf.assign(**pdf.loc[:,arb_cols].mask(pdf.loc[:,arb_cols]==2,99))
Out[1193]: 
    a   b  c
0   1  99  5
1  99   3  6
2   3   4  7

在这种情况下,如果需要应用自定义函数,最好使用
applymap

pdf[arb_cols] = pdf[arb_cols].applymap(lambda x : 99 if x == 2 else x)

所以,即使它使用for循环,它也比apply快?非常有趣是的,那是真的。Apply只是一个薄薄的循环。使用列表理解将其减少到一行是否可能或可取?我对最近出现的未来警告的解决方案很感兴趣:
传递list likes to.loc或[]以及任何缺少的标签将在将来引发KeyError,您可以使用.reindex()或者。
@MikePalmice哪一个会返回mse警告?哦,对不起。我选择了
mask
解决方案