从 pandas 数据帧中删除特定单词

Removing specific words from pandas dataframe

提问人:Popeye 提问时间:6/23/2023 更新时间:6/26/2023 访问量:60

问:

示例表:

一个
锐龙CPU,锐龙5 5600X,最佳,AMD 锐龙,销售
中央处理器,Ryzen 9 7800X,可用,Ryzen 电脑,全新
df = pd.DataFrame({'a' : ['ryzen cpu,ryzen 5 5600x,best,amd ryzen,sale',
                         'cpu,ryzen 9 7800x,available,computer for ryzen,new']})
from nltk.corpus import stopwords, wordnet
stop = stopwords.words('english')
b = ['best', 'sale', 'new','available']
c = stop + b
x = []
for i in df['a'].str.split(','):
    for j in i:
        if j not in b:
            x.append(j)
print(x)

我正在尝试删除上述停用词和其他特定词,即使其他词被删除,但停用词没有。

这是我得到的输出:

['ryzen cpu', 'ryzen 5 5600x', 'amd ryzen', 'cpu', 'ryzen 9 7800x', 'computer for ryzen']

此外,我无法以表格格式获取它,我尝试使用以下列表推导式,但它不起作用:

df['a'] = df['a'].apply(lambda x: ''.join([j for i in x.split(' , ') for j in i if j not in c]))
df['a']

它给出的输出似乎完全关闭(一些字母完全消失了,例如“Ryzen”变成了“RZEN”,“Sale”变成了“LE”等):

一个
RZEN CPU,RZEN 5 5600X,BE,RZEN,LE
CPU,RZEN 9 7800X,VLBLE,CPUER FR RZEN,新增功能

如果有人可以帮助我了解我到底做错了什么,以及如何进一步进行?

预期输出如下所示:

一个
锐龙CPU,锐龙5 5600X,AMD 锐龙
中央处理器,Ryzen 9 7800X,电脑 Ryzen
python pandas 数据帧 nltk 停用词

评论


答:

1赞 Maria K 6/23/2023 #1

你真的没有使用停用词,只是使用你的附加词,看看这一行

if j not in b:

在此处将 b 更改为 c。

如果您命名变量,以便名称表示它们所包含的内容,它确实有助于调试。

至于这里的循环,代码看起来很难读,让我们一步一步地理解它

df['a'] = df['a'].apply(lambda x: ''.join([j for i in x.split(' , ') for j in i if j not in c]))
  • i- 是单词(部分xfor i in x.split(' , '))
  • j- 是i (for j in i)
  • 然后对 (jif j not in c)
  • 然后连接在一起j

这就是你最终获得随机符号的方式。我认为正确的做法是在 apply 中摆脱 lambda,因为它有太多的逻辑 - 很容易混淆。最好编写一个单独的函数并应用它。

(顺便说一句,不要除以,除以!" , "","

def filter_stop_words(values, stop_words=c):
    words = values.split(",")
    return "".join(filter(lambda x: x not in stop_words, words))

df['a'].apply(filter_stop_words)

评论

0赞 Popeye 6/23/2023
嗨,玛丽亚,感谢您的回答,我能够删除特定单词,但是停用词:“for”没有被删除,在应用停用词删除之前,我是否必须标记这些单词?我还有另一个查询,所以我能够删除停用词,并在关键字位于多行时对它们执行其他词法分析步骤,例如:['ryzen','ryzen 9, 'computer for gamers', 'available'] 但是在合并行并删除重复行时,我留下了额外的逗号,例如:['ryzen,Ryzen 9,,Ryzen5800X']等有 2 个逗号,我只想有 1 个逗号
0赞 user19077881 6/23/2023 #2

您可以使用:

df['a'] = df['a'].str.replace('|'.join(c), "", regex = True).replace(',,', ',', regex = True)

最后的替换是删除双逗号标记已删除项的位置,,

评论

0赞 Popeye 6/23/2023
我遵循了这一点,但输出看起来与我之前得到的输出相似:[rzen cpu,rzen 5 5600x,rzen,]
0赞 user19077881 6/23/2023
使用您的数据和上面的代码,我得到了您需要的(除了可以轻松删除的尾随逗号)。除了您提供的信息之外,似乎还有其他事情正在发生。ryzen cpu,ryzen 5 5600x,amd ryzen,
0赞 Timus 6/26/2023 #3

您可以执行以下操作:

from nltk.corpus import stopwords

STOPS = set(stopwords.words('english') + ['best', 'sale', 'new','available'])
def remove_stops(words):
    if (words := [word for word in words if word not in STOPS]):
        return words

df['a'] = (df['a'].str.split(',').explode().str.split()
           .map(remove_stops).dropna()
           .str.join(' ').groupby(level=0).agg(','.join))

示例数据帧的结果:

                                   a
0  ryzen cpu,ryzen 5 5600x,amd ryzen
1   cpu,ryzen 9 7800x,computer ryzen