从 pandas 数据框的列中提取主题标签
Extract hashtags from columns of a pandas dataframe
我有一个数据框 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 中有什么东西可以让我更有效、更快地执行此操作。
您可以使用 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]
这returns一栏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|$)
- 预测词尾或句尾
如果您的 #
可能位于 而不是 标签的单词中间,那将产生您不希望出现的误报。在这种情况下,您可以修改您的正则表达式以包含后视:
(?:(?<=\s)|(?<=^))#.*?(?=\s|$)
正则表达式回顾断言 space 或句子的开头必须在 #
字符之前。
我有一个数据框 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 中有什么东西可以让我更有效、更快地执行此操作。
您可以使用 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]
这returns一栏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|$)
- 预测词尾或句尾
如果您的 #
可能位于 而不是 标签的单词中间,那将产生您不希望出现的误报。在这种情况下,您可以修改您的正则表达式以包含后视:
(?:(?<=\s)|(?<=^))#.*?(?=\s|$)
正则表达式回顾断言 space 或句子的开头必须在 #
字符之前。