【问题标题】:Extract hashtags from columns of a pandas dataframe从 pandas 数据框的列中提取主题标签
【发布时间】:2018-02-03 02:51:31
【问题描述】:

我有一个数据框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 中有什么东西可以用来有效和更快地执行此操作。

【问题讨论】:

    标签: python pandas dataframe extract hashtag


    【解决方案1】:

    你可以使用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]
    

    这会返回一列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
    

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

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

    为了理解它,把它分解:

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

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

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

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

    【讨论】:

    • 有没有办法在单个列表中获取所有主题标签,而不是在列中获取多个列表?我正在尝试使用附加或加入,但它不起作用。
    • @sparktime12 你在结果系列上调用 .values.reshape(-1,).tolist()。
    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多