首页 文章

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

提问于
浏览
1

我有一个数据框 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('#')]]

大熊猫有什么东西我可以用来有效和快速地执行这个 .

1 回答

  • 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 的列 .

    如果你想先过滤然后找到,你可以很容易地使用 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|$)
    

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

相关问题