如何在Python中对数据框的每一行使用split函数?

22

我希望能够统计评论字符串中某个词重复出现的次数。

我正在读取CSV文件,并使用以下代码将其存储在Python数据框中。

reviews = pd.read_csv("amazon_baby.csv")
下面几行代码在我将其应用于单个评论时有效。
print reviews["review"][1]
a = reviews["review"][1].split("disappointed")
print a
b = len(a)
print b
上述代码的输出为:
it came early and was not disappointed. i love planet wise bags and now my wipe holder. it keps my osocozy wipes moist and does not leak. highly recommend it.
['it came early and was not ', '. i love planet wise bags and now my wipe holder. it keps my osocozy wipes moist and does not leak. highly recommend it.']
2

当我使用下面这行代码尝试将同样的逻辑应用于整个数据帧时,我收到了一个错误消息

reviews['disappointed'] = len(reviews["review"].split("disappointed"))-1

错误信息:

Traceback (most recent call last):
  File "C:/Users/gouta/PycharmProjects/MLCourse1/Classifier.py", line 12, in <module>
    reviews['disappointed'] = len(reviews["review"].split("disappointed"))-1
  File "C:\Users\gouta\Anaconda2\lib\site-packages\pandas\core\generic.py", line 2360, in __getattr__
    (type(self).__name__, name))
AttributeError: 'Series' object has no attribute 'split'
4个回答

25
你正在尝试分割数据框中整个评论列(这是错误消息中提到的Series)。你想要做的是对数据框的每一行应用一个函数,可以通过在数据框上调用apply来实现:
f = lambda x: len(x["review"].split("disappointed")) -1
reviews["disappointed"] = reviews.apply(f, axis=1)

除了将数据读入“reviews”变量之外,我需要在这段代码中添加其他行吗?因为上面的两行没有起作用。 - goutam
我认为按照写的应该没问题,但是我没有测试过。出了什么错? - hoyland
文件“Classifier.py”,第18行,在<module>中: reviews [“disappointed”] = reviews.apply(f,axis = 1) 在“pandas \ core \ frame.py”的第3972行中,应用 返回self.apply_standard(f,axis,reduce = reduce) 在“pandas \ core \ frame.py”的第4064行中,_apply_standard results [i] = func(v) 在“Classifier.py”的第17行,lambda x: f = lambda x:len(reviews [“review”] .split(“disappointed”) -1 在“pandas \ core \ generic.py”的第2360行,__getattr_ (type(self).__name__,name)) AttributeError:“'Series'对象没有属性'split'”,发生于索引0处 - goutam
糟糕,应该是 lambda x: len(x["review"].split("disappointed")) -1。这里的 x 是传递给函数的行而不是整个数据框本身。 - hoyland

16

pandas 0.20.3有pandas.Series.str.split(),它作用于系列中的每个字符串并进行分割。因此,您可以简单地分割然后计算所做的拆分数。

len(reviews['review'].str.split('disappointed')) - 1

pandas.Series.str.split


1
我认为这是最符合Pandas风格的解决方案,而且可能更快。不知道原帖作者有没有对其进行性能测试的机会。 - rajan

2

好的,问题出在:

reviews["review"]

以上是一个系列。在你的第一段代码中,你正在做这件事:
reviews["review"][1].split("disappointed")

也就是说,您正在为审查放置索引。您可以尝试循环遍历列的所有行并执行所需的操作。例如:

for index, row in reviews.iterrows():
    print len(row['review'].split("disappointed"))

    

2
您可以使用.str在字符串系列上使用字符串方法:
reviews["review"].str.split("disappointed")

str不能解决问题。reviews["review"]返回一系列字符串而不是一个字符串。 - Ozgur Ozturk
@OzgurOzturk 它确实解决了对每一行应用split的问题。但它并没有解决计算长度的问题,因为我认为这很容易解决。而且我知道reviews["review"]是由一系列字符串组成的系列数据。你为什么觉得我不知道呢? - Stop harming Monica
这在我的问题上有点起作用...你如何仅获取系列拆分后的值? - santma
@santma,我不知道你在这里所说的“值”的意思。你可能需要提出一个新问题,并包含一个[mcve]。 - Stop harming Monica
@StopharmingMonica 当我使用.split()时,我会得到分割后的两个部分。例如,我有一个数据框中的URL列表,其格式如下:'https://www.domain.co/product/product-name/'。我想要得到的只是“product-name”。当我使用.split("product/")时,我得到了["https://www.domain.co/","product-name/"]。 - santma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接