[英]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.