我有一个数千行的列表,我试图学习矢量化方法来加速处理。我想知道以下是否可能。
在下面的表格中,我想删除"TextToRemove"中的文本。从"全名"中的文本中删除。列。因此,对于第0行,预期输出应该是"Active Auto MY16">
我已经尝试过df["Full Name"].str.replace(df["TextToRemove"],"")
,但得到了一个"'系列'对象是可变的,因此它们不能被散列"。异常消息。我也试过用np.where
和np.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 |