我有一个数据框df
,
import pandas as pd
df = pd.DataFrame(
{
"ID": [1, 2, 3, 4, 5],
"name": [
"Hello Kitty",
"Hello Puppy",
"It is an Helloexample",
"for stackoverflow",
"Hello World",
],
}
)
如下所示:
ID name
0 1 Hello Kitty
1 2 Hello Puppy
2 3 It is an Helloexample
3 4 for stackoverflow
4 5 Hello World
我有一个字符串列表To_remove_list
To_remove_lst = ["Hello", "for", "an", "It"]
我需要从name
的{{1}}列中删除列表中存在的所有字符串。如何在熊猫中做到这一点?
我的预期答案是:
df
答案 0 :(得分:7)
我认为需要str.replace
还要删除子字符串:
df['name'] = df['name'].str.replace('|'.join(To_remove_lst), '')
如果可能的话,一些正则表达式字符:
import re
df['name'] = df['name'].str.replace('|'.join(map(re.escape, To_remove_lst)), '')
print (df)
ID name
0 1 Kitty
1 2 Puppy
2 3 is example
3 4 stackoverflow
4 5 World
但是如果只想删除单词,请使用嵌套列表理解:
df['name'] = [' '.join([y for y in x.split() if y not in To_remove_lst]) for x in df['name']]
答案 1 :(得分:4)
出于速度考虑,我建议在列表理解中使用re.sub
。
import re
p = re.compile('|'.join(map(re.escape, To_remove_lst)))
df['name'] = [p.sub('', text) for text in df['name']]
print (df)
ID name
0 1 Kitty
1 2 Puppy
2 3 is example
3 4 stackoverflow
4 5 World
列表推导以C语言实现,并以C速度运行。我强烈建议您暂时在通过熊猫str
函数使用字符串和正则表达式数据时使用列表解析,因为该API有点慢。
使用map(re.escape, To_remove_lst)
是为了避免可能在替换期间按字面意义处理的任何正则表达式元字符。
在调用regex.sub
之前对模式进行了预编译,以减少每次迭代时的编译开销。
我也允许它滑动,但请使用兼容PEP-8的变量名“ to_remove_lst”(小写蛇)。
时间
df = pd.concat([df] * 10000)
%timeit df['name'].str.replace('|'.join(To_remove_lst), '')
%timeit [p.sub('', text) for text in df['name']]
100 ms ± 5.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
60 ms ± 3.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
答案 2 :(得分:3)
您可以简单地做到:
df['name'].replace(to_remove_lst, value='', regex=True)
获得:
0 Kitty
1 Puppy
2 is example
3 stackoverflow
4 World
答案 3 :(得分:0)
您可以为每个元素运行一个for循环,然后使用str.replace
for WORD in To_remove_lst:
df['name'] = df['name'].str.replace(WORD, '')
输出:
ID name
0 1 Kitty
1 2 Puppy
2 3 is example
3 4 stackoverflow
4 5 World