提问人:Popeye 提问时间:6/23/2023 更新时间:6/26/2023 访问量:60
从 pandas 数据帧中删除特定单词
Removing specific words from pandas dataframe
问:
示例表:
一个 |
---|
锐龙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 |
答:
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
- 是单词(部分x
for i in x.split(' , ')
)j
- 是i
(for j in i
)- 然后对 (
j
if 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
评论