从熊猫数据框的列中提取主题标签

spa*_*e12 2 python extract dataframe hashtag pandas

我有一个数据框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 
Run Code Online (Sandbox Code Playgroud)

我尝试这样的事情,但给空的数据框:

df.loc[df['Max'] == 45, [hsh for hsh in 'tweets' if hsh.startswith('#')]]
Run Code Online (Sandbox Code Playgroud)

熊猫里有什么我可以用来有效,更快地执行的吗?

cs9*_*s95 5

您可以使用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]
Run Code Online (Sandbox Code Playgroud)

返回lists 的列。

如果要先过滤然后查找,则可以使用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
Run Code Online (Sandbox Code Playgroud)

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

#.*?(?=\s|$)
Run Code Online (Sandbox Code Playgroud)

要了解它,请将其分解:

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

如果可能#的话中包含不是主题标签的单词,这将产生您不希望出现的误报。在这种情况下,您可以修改您的正则表达式,使其包含以下内容:

(?:(?<=\s)|(?<=^))#.*?(?=\s|$)
Run Code Online (Sandbox Code Playgroud)

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