twitter'flora'对象没有属性'lower'

时间:2018-04-05 04:02:43

标签: python pandas twitter

我正在尝试导入保存为文本文件的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'

2 个答案:

答案 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()

希望这会有所帮助。