替换数据框列中的文本,如果该文本出现在后续列中



我有一个数千行的列表,我试图学习矢量化方法来加速处理。我想知道以下是否可能。

在下面的表格中,我想删除"TextToRemove"中的文本。从"全名"中的文本中删除。列。因此,对于第0行,预期输出应该是"Active Auto MY16">

我已经尝试过df["Full Name"].str.replace(df["TextToRemove"],""),但得到了一个"'系列'对象是可变的,因此它们不能被散列"。异常消息。我也试过用np.wherenp.select,但不太成功。

我能想到的唯一其他选择是做一个for循环,但我很想知道是否有更好的方法。该文件包含超过10,000行。

Full Name         TextToRemove
0                     2015 Hyundai i30 Active Auto MY16     2015 Hyundai i30
1                           2017 Kia Cerato S Auto MY18      2017 Kia Cerato
2                           2017 Kia Cerato S Auto MY17      2017 Kia Cerato
3                       2017 Kia Cerato Sport Auto MY17      2017 Kia Cerato
4                           2019 Kia Cerato S Auto MY19      2019 Kia Cerato

您可以使用apply:

df["full_name"] = df.apply(lambda x: x["full_name"].replace(x["text_to_remove"], ""), axis=1)
# 525 µs ± 14.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

或者使用numpy(更快):

df["full_name"] = np.char.replace(df["full_name"].values.astype(str), df["text_to_remove"], "")
# 91 µs ± 2.61 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) --> ~5.8 times faster

用删除的文本替换full_name列。

|    | full_name        | text_to_remove   |
|---:|:-----------------|:-----------------|
|  0 | Active Auto MY16 | 2015 Hyundai i30 |
|  1 | S Auto MY18      | 2017 Kia Cerato  |
|  2 | S Auto MY17      | 2017 Kia Cerato  |
|  3 | Sport Auto MY17  | 2017 Kia Cerato  |
|  4 | S Auto MY19      | 2019 Kia Cerato  |

最新更新