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
解决方案