从pandas数据帧的列中提取主题标签

时间:2017-08-25 05:21:22

标签: python pandas dataframe extract hashtag

我有一个数据框df。我想从推文中提取主题标签,其中Max == 45。:

Max    Tweets
42   via @VIE_unlike at #fashion
42   Ny trailer #katamaritribute #ps3
45   Saved a baby bluejay from dogs #fb
45   #Niley #Niley #Niley 

我正在尝试这样的事情,但它给出了空数据框:

df.loc[df['Max'] == 45, [hsh for hsh in 'tweets' if hsh.startswith('#')]]

pandas中有什么东西我可以用来有效和快速地执行此操作。

1 个答案:

答案 0 :(得分:3)

您可以使用pd.Series.str.findall

In [956]: df.Tweets.str.findall(r'#.*?(?=\s|$)')
Out[956]: 
0                  [#fashion]
1    [#katamaritribute, #ps3]
2                       [#fb]
3    [#Niley, #Niley, #Niley]

这会返回一列list s。

如果您想先过滤然后查找,可以使用boolean indexing轻松完成:

In [957]: df.Tweets[df.Max == 45].str.findall(r'#.*?(?=\s|$)')
Out[957]: 
2                       [#fb]
3    [#Niley, #Niley, #Niley]
Name: Tweets, dtype: object

这里使用的正则表达式是:

#.*?(?=\s|$)

要理解它,请将其分解:

  • #.*? - 对以#标签开头的单词执行非贪婪匹配
  • (?=\s|$) - 预言句子的结尾或句子的结尾

如果有可能#位于标签的单词中间,那么会产生您不想要的误报。在这种情况下,您可以修改正则表达式以包含lookbehind:

(?:(?<=\s)|(?<=^))#.*?(?=\s|$)

正则表达式后台断言断言空格或句子的开头必须位于#个字符之前。