python - 精确的单词匹配并显示在列中

标签 python string pandas dataframe

我有以下数据框(df)

   Comments                       ID
0        10         Looking for help
1        11  Look at him but be nice
2        12                  Be calm
3        13               Being good
4        14              Him and Her
5        15                  Himself

以及列表中的一些单词,我需要搜索完全匹配

word_list = ['look','be','him']

这是我想要的输出

   Comments                       ID Word_01 Word_02 Word_03
0        10         Looking for help                        
1        11  Look at him but be nice    look     be      him
2        12                  Be calm    be                
3        13               Being good                        
4        14              Him and Her    him                
5        15                  Himself  

我尝试过一些东西,比如 str.findall

str.findall(r"\b" + '|'.join(word_list) + r"\b",flags = re.I)

还有其他一些,但我似乎无法为我的话找到完全匹配的内容。

任何解决此问题的帮助将不胜感激。

谢谢

最佳答案

您需要每个单词的单词边界。一种可能的解决方案是 Series.str.extractall , DataFrame.add_prefixDataFrame.join原始DataFrame:

word_list = ['look','be','him']

pat = '|'.join(r"\b{}\b".format(x) for x in word_list)
df1 = df['ID'].str.extractall('(' + pat + ')', flags = re.I)[0].unstack().add_prefix('Word_')

对于输出中的小写数据,请添加 Series.str.lower :

df1 = (df['ID'].str.lower()
               .str.extractall('(' + pat + ')')[0]
               .unstack()
               .add_prefix('Word_'))
<小时/>
df = df.join(df1).fillna('')
print (df)
   Comments                       ID Word_0 Word_1 Word_2
0        10         Looking for help                     
1        11  Look at him but be nice   Look    him     be
2        12                  Be calm     Be              
3        13               Being good                     
4        14              Him and Her    Him              
5        15                  Himself              

您的解决方案应该按相同的模式进行更改,将值转换为 list 并将 join 转换为原始值:

pat = '|'.join(r"\b{}\b".format(x) for x in word_list)
df1 = (pd.DataFrame(df['ID']
        .str.findall(pat, flags = re.I).values.tolist())
        .add_prefix('Word_')
        .fillna(''))   

或者使用列表理解(应该是最快的):

df1 = (pd.DataFrame([re.findall(pat, x, flags = re.I) for x in df['ID']])
       .add_prefix('Word_')
       .fillna(''))

对于小写字母,请添加.lower():

pat = '|'.join(r"\b{}\b".format(x) for x in word_list)
df1 = (pd.DataFrame([re.findall(pat, x.lower(), flags = re.I) for x in df['ID']])
           .add_prefix('Word_')
           .fillna(''))

关于python - 精确的单词匹配并显示在列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241270/

相关文章:

python - 有没有一种方法可以在不重写整个代码的情况下将完整的Python(psychopy)程序实现到neurobs演示中?

python - 模拟返回模拟对象而不是返回值

Java 字符串分割/操作

javascript - 如何删除字符串中仅出现一次的 'abc' ?

python - 将 django.request 记录到文件而不是控制台

python - 如何从 Python 调用 Go 函数

c++ - 取多行输入,以逗号分隔,将每行存储到字符串数组中

python - 根据另一个子级列的位置在子级添加一个列

python - 使用 JSON 功能读取 CSV

python - 谁能帮我? PANDAS 和 MySql