【问题标题】:Apply a function to each element of a pandas series将函数应用于熊猫系列的每个元素
【发布时间】:2018-08-26 01:54:01
【问题描述】:

我正在尝试标记我的pandas 系列的每个句子。 我尝试按照我在文档中看到的那样使用 apply,但没有奏效:

x.apply(nltk.word_tokenize)

如果我只使用nltk.word_tokenize(x) 也不起作用,因为x 不是字符串。有人知道吗?

已编辑:x 是带有句子的pandas 系列:

0       A very, very, very slow-moving, aimless movie ...
1       Not sure who was more lost - the flat characte...
2       Attempting artiness with black & white and cle...

x.apply(nltk.word_tokenize) 返回的结果完全相同:

0       A very, very, very slow-moving, aimless movie ...
1       Not sure who was more lost - the flat characte...
2       Attempting artiness with black & white and cle...

nltk.word_tokenize(x) 的错误是:

TypeError: expected string or bytes-like object

【问题讨论】:

  • 当您说它不起作用时,您是否收到错误消息?如果是这样,您可以在此处粘贴错误吗?还有一个非常小的例子说明x 是什么会有帮助
  • 你运行print(x.apply(nltk.word_tokenize)这会返回相同的结果吗?
  • 如果 nltk.word_tokenize(x) 给你 TypeError: expected string or bytes-like object - 可能是你有空值。
  • type(x) 的输出是什么?

标签: python python-3.x pandas nltk


【解决方案1】:

问题:您要保存中间结果吗? x.apply() 创建原始Series 的副本,并对Series 的每个元素应用适当的转换。请参阅下面的示例,了解这可能如何影响您的代码...

我们将首先确认 word_tokenize() 可以处理文本的示例 sn-p。

>>> import pandas as pd
>>> from nltk import word_tokenize
>>> word_tokenize('hello how are you')   # confirming that word_tokenize works.
['hello', 'how', 'are', 'you']            

然后让我们创建一个Series 来玩。

>>> s = pd.Series(['hello how are you',
                   'lorem ipsum isumming lorems',
                   'more stuff in a line'])

>>> print(s)
0              hello how are you
1    lorem ipsum isumming lorems
2           more stuff in a line
dtype: object

在交互式 Python 提示符下使用 apply() 函数执行 word_tokenize 表明它会标记化...

但并不表示这是一个副本...不是永久更改s

>>> s.apply(word_tokenize)
0              [hello, how, are, you]
1    [lorem, ipsum, isumming, lorems]
2          [more, stuff, in, a, line]
dtype: object

其实我们可以打印s来表明它没有改变...

>>> print(s)
0              hello how are you
1    lorem ipsum isumming lorems
2           more stuff in a line
dtype: object

相反,如果我们为apply() 函数调用的结果提供标签,在本例中为wt,它允许我们永久保存结果。我们可以通过打印wt看到。

>>> wt = s.apply(word_tokenize)
>>> print(wt)
0              [hello, how, are, you]
1    [lorem, ipsum, isumming, lorems]
2          [more, stuff, in, a, line]
dtype: object

在交互式提示下执行此操作可以让我们更轻松地检测到这种情况,但在脚本中运行它有时意味着生成副本的事实将无声无息地传递,没有任何指示。

【讨论】:

    【解决方案2】:

    apply 调用应该可以正常工作。我试过你的代码,它对我来说很好。你能分享你正在使用的确切代码吗

        In [16]: s
        Out[16]:
        0     A very, very, very slow-moving, aimless movie
        1    Not sure who was more lost - the flat characte
        dtype: object
    
        In [17]: s.apply(nltk.word_tokenize)
        Out[17]:
        0    [A, very, ,, very, ,, very, slow-moving, ,, ai...
        1    [Not, sure, who, was, more, lost, -, the, flat...
        dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2019-03-05
      • 2020-05-12
      • 2017-08-23
      • 2014-09-24
      • 2018-02-09
      • 2019-03-27
      相关资源
      最近更新 更多