假设您在数据框df 中有列Text,您可以尝试:
df2 = df['Text'].str.split().explode()
m = df2.str.contains(r'[A-Za-z]') & df2.str.contains(r'\d')
df_out = df2[~m].groupby(level=0).agg(' '.join)
df_out = df_out.to_frame(name='Text')
说明
我们将文本拆分为单独的单词,然后将单词列表分解为多行,一行中包含一个单词。然后我们使用.str.contains()通过正则表达式测试单词是否包含任何字母字符和数字,如下所示:
.str.contains(r'[A-Za-z]') # test any character in [A-Za-z] in string
和
.str.contains(r'\d') # test any numeric digit in string
然后使用 alpha 和 digit 测试的布尔掩码 m,我们仅选择那些不包含 both alpha 和数字的行条目:
df2[~m]
然后,我们通过使用将过滤后的单词(没有字母数字单词)组装回一个句子
groupby(level=0).agg(' '.join)
这里,我们按level=0分组,这是爆炸前的原始行索引(即原始行号)。
演示
data = {'Text': ['2fvRE-Ku89lkRVJ44QQFN ABACUS LABS, INC', 'abc123 CAT LABS, INC']}
df = pd.DataFrame(data)
Text
0 2fvRE-Ku89lkRVJ44QQFN ABACUS LABS, INC
1 abc123 CAT LABS, INC
df2 = df['Text'].str.split().explode()
m = df2.str.contains(r'[A-Za-z]') & df2.str.contains(r'\d')
df_out = df2[~m].groupby(level=0).agg(' '.join)
df_out = df_out.to_frame(name='Text')
Text
0 ABACUS LABS, INC
1 CAT LABS, INC
编辑
我们也可以简化为:
df2 = df['Text'].str.findall(r'\b(?!.*[A-Za-z]+.*\d+)(?!.*\d+.*[A-Za-z]+.*).+\b').str.join(' ').str.strip()
说明
这里我们使用的正则表达式还是要遵守排除字母数字词的要求。正则表达式:
r'\b(?!.*[A-Za-z]+.*\d+)(?!.*\d+.*[A-Za-z]+.*).+\b'
在单词边界 \b .... \b 内,我们使用 2 个否定前瞻来检查 字母和数字字符。我们需要 2 个负前瞻而不是 1 个,因为 alpha 可能出现在数字之前,反之亦然。