将功能应用于熊猫系列的每个元素

时间:2018-08-26 01:54:01

标签: python python-3.x pandas nltk

我正在尝试标记pandas系列中的每个句子。 我尝试使用文档中的方法执行文档中的操作,但是没有用:

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

2 个答案:

答案 0 :(得分:2)

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

我们首先要确认word_tokenize()是否适用于示例文本片段。

>>> 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提示符上使用word_tokenize函数执行apply()表示它已标记化...

但这并不表示这是副本...不是对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

相反,如果我们在wt函数调用的结果中提供标签(在这种情况下为apply()),则可以使我们永久保存结果。通过打印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

在交互式提示上执行此操作可以使我们更容易地检测到这种情况,但是有时在脚本中运行该条件意味着生成副本的事实将以静默方式通过而没有任何指示。

答案 1 :(得分:0)

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