【问题标题】:How to use the split function on every row in a dataframe in Python?如何在 Python 的数据框中的每一行上使用 split 函数?
【发布时间】:2016-07-06 14:58:51
【问题描述】:

我想计算一个单词在评论字符串中重复的次数

我正在读取 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'

【问题讨论】:

    标签: python string dataframe


    【解决方案1】:

    您正在尝试拆分数据框的整个评论列(即错误消息中提到的系列)。您要做的是对数据框的每一行应用一个函数,您可以通过在数据框上调用apply 来做到这一点:

    f = lambda x: len(x["review"].split("disappointed")) -1
    reviews["disappointed"] = reviews.apply(f, axis=1)
    

    【讨论】:

    • 除了将数据读入reviews 变量之外,我还需要在此代码中添加任何其他行吗?因为上面两行没有用。
    • 我认为它应该像书面的那样工作,但我没有测试它。出了什么问题?
    • 文件“Classifier.py”,第 18 行,在 评论[“失望”] = reviews.apply(f, axis=1) 文件“pandas\core\frame.py”,第 3972 行,在应用中返回 self._apply_standard(f, axis, reduce=reduce) 文件“pandas\core\frame.py”,第 4064 行,在 apply_standard 结果[i] = func(v) 文件“分类器。 py",第 17 行,在 f = lambda x: len(reviews["review"].split("disappointed")) -1 文件 "pandas\core\generic.py",第 2360 行,在 getattr (type(self).__name_, name)) AttributeError: ("'Series' object has no attribute 'split'", u'occurred at index 0')
    • 糟糕。应该是lambda x: len(x["review"].split("disappointed")) -1。 x 是传递给函数的行而不是整个数据框本身。
    【解决方案2】:

    嗯,问题出在:

    reviews["review"]
    

    以上是一个系列。在您的第一个 sn-p 中,您正在这样做:

    reviews["review"][1].split("disappointed")
    

    也就是说,您正在为评论添加索引。您可以尝试遍历列的所有行并执行所需的操作。例如:

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

    【讨论】:

      【解决方案3】:

      您可以使用.str 对一系列字符串使用字符串方法:

      reviews["review"].str.split("disappointed")
      

      【讨论】:

      • str 不能解决问题。 reviews["review"] 给出了一系列字符串而不是一个字符串。
      • @OzgurOzturk 它确实解决了将split 应用于每一行的问题。 Id 不能解决计算长度的问题,因为我认为这很容易。而且我知道reviews["review"] 是一系列字符串。为什么你认为我没有?
      • 这种方法解决了我的问题....你如何只获得系列拆分后的值?
      • @santma 我不知道你所说的“价值”是什么意思。您可能想问一个新问题,包括minimal reproducible example。
      • @StopharmingMonica 当我使用 .split() 时,我会返回 split() 的两边。例如,我在数据框中有一个遵循以下格式的 URL 列表:'domain.co/product/product-name'。我只想得到“产品名称”。当我使用 .split("product/") 我得到 ["domain.co/","product-name/"].
      【解决方案4】:

      pandas 0.20.3 具有 pandas.Series.str.split() 作用于系列的每个字符串并进行拆分。所以你可以简单地拆分,然后计算拆分的数量

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

      pandas.Series.str.split

      【讨论】:

      • 我认为这是最适合 Pandas 的解决方案,而且可能更快。想知道 OP 是否有机会对其进行性能测试。
      猜你喜欢
      • 2016-02-04
      • 2021-08-18
      • 2011-04-08
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2023-03-26
      • 2020-08-27
      相关资源
      最近更新 更多