迭代数据框中的文本列

时间:2018-01-08 13:44:50

标签: python-3.x pandas

DataFrame

大家好。我正在研究一个超过18000个观测数据帧(上图)。我想要做的是将列中的文本一个接一个地“检查”,然后再对其进行字数统计。目前我一直试图迭代它,但我得到了像"TypeError: 'float' object is not iterable"这样的错误。这是我使用的代码:

def tokenize(text):
    for row in text:
        for i in row:
            if i is not None:
                words = i.lower().split()
                return words
            else:
                return None

data['review_two'] = data['review'].apply(tokenize)

现在我的问题是:我如何有效而高效地对列'审核'进行迭代,以便我现在可以在我现在对其执行字数统计之前一个接一个地预处理每一行?

3 个答案:

答案 0 :(得分:0)

我不确定你要做什么,尤其是for i in row。在任何情况下,apply已遍历DataFrame / Series的行,因此无需在传递给apply的函数中执行此操作。

此外,您的代码不会为您的DataFrame返回TypeError,例如您的列包含字符串。请参阅here,了解如何查看您的评论'列仅包含文本。

答案 1 :(得分:0)

也许是这样的,给你字数,其余的我不明白你想要的。

import pandas as pd

a = ['hello friend', 'a b c d']
b = pd.DataFrame(a)

print(b[0].str.split().str.len())

>> 0    2
   1    4

答案 2 :(得分:0)

我对该错误的假设是您缺少数据NaN并使tokenize函数失败。您可以使用pd.isnull(df["review"])进行检查,它将显示一个布尔数组,表明每行是否为NaN。如果any(pd.isnull(df["review"]))为真,则列中缺少值。

我无法重现错误,因为我没有数据,但我认为您的目标可以实现。

from collections import Counter
df = pd.DataFrame([{"name": "A", "review": "No it is not good.", "rating":2},
                {"name": "B", "review": "Awesome!", "rating":5},
                 {"name": "C", "review": "This is fine.", "rating":3},
                 {"name": "C", "review": "This is fine.", "rating":3}])

# first .lower and then .replace for punctuations and finally .split to get lists
df["splitted"] = df.review.str.lower().str.replace('[^\w\s]','').str.split()

# pass a counter to count every list. Then sum counters. (Counters can be added.)
df["splitted"].transform(lambda x: Counter(x)).sum()

Counter({'awesome': 1,
     'fine': 2,
     'good': 1,
     'is': 3,
     'it': 1,
     'no': 1,
     'not': 1,
     'this': 2})

str.replace部分是删除标点符号,请参阅@EdChum的答案Replacing punctuation in a data frame based on punctuation list