我试图#从推文文本中过滤掉所有关键字.我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)
希望能奏效
如果您不太热衷于使用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)
我希望这有帮助。