我喜欢使用pandas
,因为我在处理表时与R
中的tidyverse
有亲缘关系。我有一个大约20万行的表,需要替换标点符号并提取非英语单词,并将其放在同一表中名为non_english
的另一列。我更喜欢使用enchant
库,因为我发现它比使用nltk
库更准确。我的假表df
有dundee
列,我正在处理。虚拟数据如下:
df = pandas.DataFrame({'dundee': ["I love:Marae", "My Whanau is everything", "I love Matauranga", "Tāmaki Makaurau is Whare", "AOD problem is common"]})
我的想法是先删除标点符号,写一个函数来提取非英语单词,然后将函数应用到数据帧,但我得到了这个错误ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
。下面是我的代码:
import pandas as pd
import enchant
import re
import string
# remove punctuations
df['dundee1'] = df['dundee'].str.replace(r'[^ws]+', ' ')
# change words to lower case
df['dundee1'] = df['dundee1'].str.lower()
# Function to check if a word is english
def check_eng(word):
# use all available english dictionary
en_ls = ['en_NZ', 'en_US', 'en_AU', 'en_GB']
en_bool = False
# check all common dictionaries if word is English
for en in en_ls:
dic = enchant.Dict(en)
if word != '':
if dic.check(word) == True:
en_bool = True
break
disp_non_en = ""
word = word.str.split(' ')
if len(word) != 0:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '
return disp_non_en
df['non_english'] = check_eng(df['dundee1'])
需要的表是这样的:
dundee non_english
0 I love:Marae Marae
1 My Whanau is everything Whanau
2 I lov Matauranga love, Matauranga
3 Tāmaki Makaurau is Whare Tāmaki Makaurau, Whare
4 AOD problem is common AOD
错误与调用有关:
check_eng(df['dundee1'])
其中df['dundee1']
是Series
类型并且你有一个if语句试图引出布尔值:
if word != '':
word
是一个Series
,所以你应该使用:
df['dundee1'].apply(check_eng)
。
check_eng
中还有一个问题:
代替:
if len(word) != 0:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '
你应该使用:
words = word.str.split(' ')
for word in words:
if en_bool == False:
disp_non_en = disp_non_en + word + ', '
因为你有:
word = word.str.split(' ')
将word
的类型从str
更改为list
,并使if
无效。
你可能想回顾一下错误的其他方面:Series的真值是二义性的。使用a.empty a.bool (), a.item (), a.any()或所有()
从word.str中删除STR。拆分(' '),它将正常工作。试试这个:单词=单词。分割(' ')