2017-08-25 83 views
0

我有一個數據框df。我想從微博中提取主題標籤,其中最大== 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('#')]] 

是有什麼在熊貓,我可以用它來執行這有效且速度更快。

回答

2

您可以使用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|$)非貪婪匹配 - 的句子

的單詞或月底結束先行。如果有可能,你在有#一個字的中間是而不是一個hashtag,這會產生你不想要的誤報。在這種情況下,您可以修改您的正則表達式來包括回顧後:

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

回顧後聲稱,空格或句子的開始必須先於#字符的正則表達式。

+0

有沒有辦法讓單列表中的所有主題標籤而不是列中的多個列表?我試圖使用追加或加入,但它不工作。 – sparktime12

+1

@ sparktime12您可以在生成的Series上調用.values.reshape(-1,)。tolist()。 –