Python Pandas在str.extractall(';';)中给出了一个错误

Python Pandas在str.extractall(';';)中给出了一个错误,python,pandas,Python,Pandas,我正在尝试从tweet文本中过滤所有的#关键字。我正在使用str.extractall()提取带有#关键字的所有关键字。 这是我第一次使用pandas从tweet文本中过滤关键词。输入、代码、预期输出和错误如下所示 输入: userID,tweetText 01, home #sweet home 01, #happy #life 02, #world peace 03, #all are one 04, world tour 等等。。。总数据文件以GB大小为单位,包含多个其他列。但我只对

我正在尝试从tweet文本中过滤所有的
#
关键字。我正在使用
str.extractall()
提取带有
#
关键字的所有关键字。 这是我第一次使用pandas从tweet文本中过滤关键词。输入、代码、预期输出和错误如下所示

输入:

userID,tweetText 
01, home #sweet home
01, #happy #life 
02, #world peace
03, #all are one
04, world tour
等等。。。总数据文件以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 
预期产出:

userID,tweetText 
01,#sweet
01,#happy 
01,#life 
02,#world
03,#all
错误:

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
这里的输出是正确的格式,但是没有关键字的输出还没有考虑到,并且没有修改

如果可能的话,我们可以忽略这样的用户ID,并且根本不在输出中显示。在下一阶段,我将尝试计算关键字的频率,其中
NAN
或空
[]
也将被计算,并且该频率可能会影响将来的分类


函数
extractall
需要一个regex模式,第一个参数是捕获组,您为此提供了
#

一个可能的参数可以是
(#\S+
。大括号表示捕获组,换句话说,
extractall
函数需要从每个字符串中提取什么

例如:

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

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(data), 
                 header=None, 
                 names=['col1', 'col2'],
                 index_col=0)

df['col2'].str.extractall('(#\S+)')
错误
ValueError:pattern不包含任何捕获组
不再与上述代码一起出现(这意味着问题已经解决),但这在当前版本的pandas中遇到了一个bug(我使用的是
'0.18.1'

返回的错误为:

AssertionError: 1 columns passed, passed data had 6 columns
描述了该问题


如果您尝试
df['col2'].str.extractall('#(\S)
(这将为您提供每个hashtag的第一个字母,您将看到
extractall
函数可以工作,只要捕获的组只包含一个字符(与问题描述匹配)。随着问题的解决,应在即将发布的pandas版本中修复该问题。

如果您不太习惯于使用
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
通过执行以下操作,可以删除textTweet列返回
Nan
的行:

data = data[~data['tweetText'].isnull()]
这应返回:

   userID tweetText
0       1    #sweet
1       1    #happy
1       1     #life
2       2    #world
3       3      #all
我希望这能有所帮助。

试试这个:

因为它会过滤“#”,所以您的NAN不应该存在

    data = pd.read_csv(StringIO(data_text),header=0, index_col=0 )
    data = data["tweetText"].str.split(' ', expand=True).stack().reset_index().rename(columns = {0:"tweetText"}).drop('level_1', 1)
    data = data[data['tweetText'].str[0] == "#"].reset_index(drop=True) 


     userID tweetText
0       1    #sweet
1       1    #happy
2       1     #life
3       2    #world
4       3      #all
@阿布杜法:

def try1():
     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)
     data = data[~data['tweetText'].isnull()]

%timeit try1()
 100 loops, best of 3: 7.71 ms per loop
@梅林法

def try2():
    data = pd.read_csv(StringIO(data_text),header=0, index_col=0 )
    data = data["tweetText"].str.split(' ', expand=True).stack().reset_index().rename(columns = {'level_0':'userID',0:"tweetText"}).drop('level_1', 1)
    data = data[data['tweetText'].str[0] == "#"].reset_index(drop=True)

%timeit try2()
100 loops, best of 3: 5.36 ms per loop

在微积分中设置大括号:

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

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

希望能起作用

谢谢你的建议。即使更改后错误仍然相同。可能是extractall的替代品吗?非常感谢你的解释。帮助很大:)我也有相同版本的pandas。@Merlin我也可以请求一些帮助吗?同时,您可以尝试使用两个括号并删除额外的列:df['col2'].str.extractall('(#\S+))这真是太神奇了!!非常感谢你。。。除了没有关键字的用户ID的
Nan
。这就是我一直在尝试的。不客气!如果
Nan
不够美观,您可以使用
fillna
Nan
中填充您选择的内容。不带#关键字的内容应包括在内。他们只是没有任何数据。这就是为什么您有
Nan
。如果你不介意的话,你能给我看更多的数据,让我知道这是在哪里发生的吗?它们不应该出现在输出中。我们使用
data=data[~data['tweetText'].isnull()]
删除了它们。您的脚本的问题是您删除
Nan
太早了。您想在完成
join
操作后删除
Nan
。感谢您提供了简短的解决方案。但是,在输出中,如果您看到userID中的第一个条目显示为
0
,应该是
1
。我也可以请求一些帮助吗?这实际上是提取方法期望正则表达式模式的方式,应该是正确的答案。谢谢!这解决了我获取“ValueError:模式不包含捕获组”的问题。
fout = data['tweetText'].str.extractall('#')