如何优化这些熊猫应用功能?

时间:2021-04-07 19:11:29

标签: pandas lambda apply

train["gender"] = train.apply(lambda x: 1 if x["gender"] == "F" else 0, axis=1) 
train["car"] = train.apply(lambda x: 1 if x["car"] == "Y" else 0, axis=1) 
train["reality"] = train.apply(lambda x: 1 if x["reality"] == "Y" else 0, axis=1) 

这3个代码即使是简单的更改也需要很多时间。
我想,访问每一行 3 次会导致效率低下。 因此,如果我可以对行进行 1 次访问并应用函数更改 3 数据,那么它可以比现在快 2~3 倍。

喜欢.....

# it is my imaginary code. not works
train[["gender","car", "reality"]] =  train.apply(lambda x: 1 if x["gender"] == "F" else 0, axis=1,
                                                  lambda y: 1 if y["car"] == "Y" else 0, axis=1,
                                                  lambda z: 1 if z["reality"] == "Y" else 0, axis=1) 

如何优化这些代码?

============================ tdy的测试结果

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以尝试 3x np.where(),即 generally the fastest option

train['gender'] = np.where(train.gender == 'F', 1, 0)
train['car'] = np.where(train.car == 'Y', 1, 0)
train['reality'] = np.where(train.reality == 'Y', 1, 0)

或者 2x np.where() 稍微慢一点:

train['gender'] = np.where(train.gender == 'F', 1, 0)
train[['car', 'reality']] = np.where(train[['car', 'reality']] == 'Y', 1, 0)

1000 万行的计时:

<头>
方法 %timeit
3x np.where() 每个循环 152 ms ± 8.86 ms(平均值 ± 标准偏差。7 次运行,每个循环 1 个)
2x np.where() 每个循环 198 ms ± 39.3 ms(平均值 ± 标准偏差。7 次运行,每个循环 1 个)
3x apply() 每个循环 8.91 秒 ± 495 毫秒(平均值 ± 标准偏差。7 次运行,每个循环 1 个)