如何从熊猫列中删除列表中存在的字符串

时间:2018-08-03 06:18:45

标签: python string pandas

我有一个数据框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

4 个答案:

答案 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