Pandas用指定列替换另一个值

时间:2018-03-05 18:18:52

标签: 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循环可以完成这样的任务吗?

3 个答案:

答案 0 :(得分:3)

带面具

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

或者使用assign

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

答案 1 :(得分:2)

当您可以使用矢量化函数时,请不要使用pd.Series.apply

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

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.where

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

答案 2 :(得分:0)

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

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