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的测试结果
答案 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 个) |