我正在尝试导入保存为文本文件的Twitter数据,并使用关键字函数来指定显示详细信息的列。
我在ipython3笔记本中使用过这段代码:
#definition for collecting keyword.
def word_in_text(word, text):
word = word.lower()
text = text.lower()
match = re.search(word, text)
if match:
return True
return False
下一个单元格包含以下代码:
#adding column
tweets['Trade'] = tweets['text'].apply(lambda tweet: word_in_text('Trade', tweet))
我得到的错误如下:
AttributeError Traceback (most recent
call last)
<ipython-input-35-b172c4e07d29> in <module>()
1 #adding column
----> 2 tweets['Trade'] = tweets['text'].apply(lambda tweet: word_in_text('Trade', tweet))
/usr/lib/python3/dist-packages/pandas/core/series.py in apply(self,
func, convert_dtype, args, **kwds)
2292 else:
2293 values = self.asobject
-> 2294 mapped = lib.map_infer(values, f,
convert=convert_dtype)
2295
2296 if len(mapped) and isinstance(mapped[0], Series):
pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:66124)()
<ipython-input-35-b172c4e07d29> in <lambda>(tweet)
1 #adding column
----> 2 tweets['Trade'] = tweets['text'].apply(lambda tweet:
word_in_text('Trade', tweet))
<ipython-input-34-daa2f94a8fec> in word_in_text(word, text)
2 def word_in_text(word, text):
3 word = word.lower()
----> 4 text = text.lower()
5 match = re.search(word, text)
6 if match:
AttributeError: 'float' object has no attribute 'lower'
答案 0 :(得分:0)
更新:我能够重现您的错误。您的部分推文中可能缺少字段
text
。
from pandas.io.json import json_normalize
tweet_data = [{'text': "let's trade!", 'lang':'en', 'place': {'country':'uk'}, 'created_at':'now', 'coordinates':'x,y', 'user':{'location':'here'}}, {'lang':'en', 'place': {'country':'uk'}, 'created_at': 'now', 'coordinates':'z,w', 'user':{'location':'there'}}]
tweets = json_normalize(tweet_data)[["text", "lang", "place.country","created_at", "coordinates","user.location"]]
我收到错误:
tweets['Trade'] = tweets['text'].apply(lambda tweet: word_in_text('Trade', tweet))
输出:
>> AttributeError: 'float' object has no attribute 'lower'
如果我使用'text'键提供tweet_data
,我就不会收到错误消息。所以,这将是一个选择。另一种选择是忽略lambda中的nan
个案例。
tweets['Trade'] = tweets['text'].apply(lambda tweet: word_in_text('Trade', tweet) if type(tweet) == str else False)
这样您就可以获得正确的输出:
>>> tweets
text lang place.country created_at coordinates user.location Trade
0 let's trade! en uk now x,y here True
1 NaN en uk now z,w there False
这是旧内容,为了完整性而留在这里。
不知何故,您将float
而不是文本传递给word_in_text
方法。我已经尝试了一个你想要实现的简单例子:
import pandas as pd
import re
def word_in_text(word, text):
word = word.lower()
text = text.lower()
match = re.search(word, text)
if match:
return True
return False
tweets = pd.DataFrame(['Hello, I like to trade', 'Trade', 'blah blah', 'Nice tradeoff here!'], columns=['text'])
输出结果为:
>>> tweets
text Trade
0 Hello, I like to trade True
1 Trade True
2 blah blah False
此外,对于此类任务,您始终可以使用Pandas的str内置contains
方法。 此代码将为您提供与上面示例相同的结果:
tweets['Trade'] = tweets['text'].str.contains("Trade", case=False) == True
我想你想检查'确切的字'匹配,意思是“Nice 交易在这里!”不应该被认定为含有这个词。您也可以解决此问题:
tweets['Trade_[strict]'] = tweets['text'].str.contains(r"Trade\b.*", case=False) == True
输出为:
>>> tweets
text Trade Trade_[strict]
0 Hello, I like to trade True True
1 Trade True True
2 blah blah False False
3 Nice tradeoff here! True False
另外,我添加了你的json_normalize方法和'假'数据,它也有效。请确保您的数据中的文字列中没有float
,而不是str
。
from pandas.io.json import json_normalize
tweet_data = [{'text': '0', 'lang':'en', 'place': {'country':'uk'}, 'created_at':'now', 'coordinates':'x,y', 'user':{'location':'here'}}, {'text': 'Trade', 'lang':'en', 'place': {'country':'uk'}, 'created_at': 'now', 'coordinates':'z,w', 'user':{'location':'there'}}]
tweets = json_normalize(tweet_data)[["text", "lang", "place.country","created_at", "coordinates","user.location"]]
应用你的方法有效。
答案 1 :(得分:0)
def word_in_text(word, text):
word = word.lower()
text = text.lower()
match = re.search(word, text)
if match:
return True
return False
tweets['Trade'] = tweets['text'].apply(lambda tweet: word_in_text('Trade', tweet))
错误:
<ipython-input-34-daa2f94a8fec> in word_in_text(word, text)
2 def word_in_text(word, text):
3 word = word.lower()
----> 4 text = text.lower()
5 match = re.search(word, text)
6 if match:
您需要检查text参数是否为str类型。因此,请按照@Guiem Bosch的答案中的说明进行检查。 否则,只需将文本参数的类型转换为:
text = type(text).lower()
希望这会有所帮助。