Pandas从str.extractall('#')给出错误

Sit*_*ogz 4 python pandas

我试图#从推文文本中过滤掉所有关键字.我str.extractall()用来提取关键字的所有#关键字.这是我第一次使用pandas从tweetText过滤关键字.输入,代码,预期输出和错误如下.

输入:

userID,tweetText 
01, home #sweet home
01, #happy #life 
02, #world peace
03, #all are one
04, world tour
Run Code Online (Sandbox Code Playgroud)

等等...总数据文件采用GB大小的推文推文和其他几列.但我只对两个栏目感兴趣.

码:

import re
import pandas as pd

data = pd.read_csv('Text.csv', index_col=0, header=None, names=['userID', 'tweetText'])

fout = data['tweetText'].str.extractall('#')

print fout 
Run Code Online (Sandbox Code Playgroud)

预期产出:

userID,tweetText 
01,#sweet
01,#happy 
01,#life 
02,#world
03,#all
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "keyword_split.py", line 7, in <module>
    fout = data['tweetText'].str.extractall('#')
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/strings.py", line 1621, in extractall
    return str_extractall(self._orig, pat, flags=flags)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/strings.py", line 694, in str_extractall
    raise ValueError("pattern contains no capture groups")
ValueError: pattern contains no capture groups
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.对于用户ID,过滤关键字的最简单方法是什么?

输出更新:

仅在使用时,输出如上所述 s.name = "tweetText" data_1 = data[~data['tweetText'].isnull()]

在这种情况下,输出为空[],仍然列出的userID和具有关键字的用户ID具有关键字数组而不是列表形式.

当只使用这个输出我们需要的东西但是 NAN

s.name = "tweetText"
data_2 = data_1.drop('tweetText', axis=1).join(s)
Run Code Online (Sandbox Code Playgroud)

这里的输出是正确的格式,但没有关键字的那些尚未考虑并且具有NAN

如果有可能我们忽略了这样的用户ID并且根本没有在输出中显示.在接下来的阶段,我试图计算关键字的频率,其中NAN或者[]也将计算空的频率,并且该频率可能会影响远期的未来分类.

在此输入图像描述

小智 7

在你的微积分中设置大括号:

fout = data['tweetText'].str.extractall('(#)')
Run Code Online (Sandbox Code Playgroud)

代替

fout = data['tweetText'].str.extractall('#')
Run Code Online (Sandbox Code Playgroud)

希望能奏效


Abd*_*dou 4

如果您不太热衷于使用extractall,您可以尝试以下操作来获得最终输出:

from io import StringIO
import pandas as pd
import re


data_text = """userID,tweetText
01, home #sweet home
01, #happy #life 
02, #world peace
03, #all are one
"""

data = pd.read_csv(StringIO(data_text),header=0)

data['tweetText'] = data.tweetText.apply(lambda x: re.findall('#(?=\w+)\w+',x))
s = data.apply(lambda x: pd.Series(x['tweetText']),axis=1).stack().reset_index(level=1, drop=True)
s.name = "tweetText"
data = data.drop('tweetText', axis=1).join(s)

     userID tweetText
0       1    #sweet
1       1    #happy
1       1     #life
2       2    #world
3       3      #all
4       4       NaN
Run Code Online (Sandbox Code Playgroud)

Nan您可以通过执行以下操作删除 textTweet 列返回 的行:

data = data[~data['tweetText'].isnull()]
Run Code Online (Sandbox Code Playgroud)

这应该返回:

   userID tweetText
0       1    #sweet
1       1    #happy
1       1     #life
2       2    #world
3       3      #all
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。