簡體   English   中英

如何從熊貓的列中刪除列表中的字符串

[英]How to remove strings present in a list from a column in 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"]

我需要從df的列name中刪除列表中存在的所有字符串。 我怎么能在熊貓中做到這一點?

我的預期答案是:

   ID               name
0   1              Kitty
1   2              Puppy
2   3              is example
3   4              stackoverflow
4   5              World

我認為需要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']]

我建議在列表理解中使用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 語言速度運行。 我強烈建議暫時通過 pandas str函數處理字符串和正則表達式數據時使用列表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)

您可以為每個元素運行 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM