【问题标题】:Why doesn't my apply function return the length of the string?为什么我的 apply 函数不返回字符串的长度?
【发布时间】:2014-01-21 18:12:08
【问题描述】:

我正在尝试在另一列中添加包含字符串长度的 Pandas DataFrame 列。

csv = pd.read_csv('data/sentiments.csv', dtype=str)
csv['length'] = csv['text'].astype(str).apply(len)
csv.head()

    text                                                 polarity   length
0    -Mi hijo es tan rico que le regalo un BMW a su...   NEUTRAL     64
1    The new BMW 3 Series is awarded 5 stars in the...   POSITIVE    64
2    @GEAGarratt BMW hand over 200 + electric vehic...   POSITIVE    64
3    I asked Sauber about more info or images of th...   NEUTRAL     64
4    bmw >>>                                             NEUTRAL     7

正如您在最后一列中看到的那样,它表示每一行的长度为 64。而另一方面,当我执行以下操作时:

len(csv.iloc[0]['text'])

它正确地将第一行的长度输出为 140。

怎么了?

【问题讨论】:

  • 只是为了尝试一些事情,如果您将 apply 的使用替换为 map,是否会发生同样的错误,因为您希望将操作喷射到单个 Series 对象上?
  • 是的,不幸的是。
  • 您能否提供一小段代码,让我们为前 5 行重建完全相同的数据帧?你能打印出Series 中的dtype 是什么吗?
  • 如果你尝试csv['text'].apply(lambda x: len(str(x)))会怎样?
  • csv['text'].str.len() 怎么样?

标签: python pandas type-conversion


【解决方案1】:

为避免astype 的类型提升逻辑可能出现的问题,您也可以尝试:

csv['length'] = csv['text'].apply(lambda x: len(str(x)))

您也可以使用map 而不是apply,因为您是按照Series 的值进行操作的。

与本机矢量化的astype 相比,使用此lambda 不是最佳选择,因此您应该在找出问题后改用此解决方法。

其他一些可能的混淆因素:(1) Seriestype 与每个元素的 type,(2) 被截断的空格...

【讨论】:

    【解决方案2】:

    您的代码和测试数据在我的电脑上运行良好。确保您的熊猫没有过时。最新的稳定版本是 0.12。

    Pandas 提供了一些vectorized string methods。你可以使用

    csv['length'] = csv['text'].str.len()
    

    改为。

    更新

    感谢@Jeff,最新版本 0.13 但不是 0.12

    【讨论】:

    • 看来我也过时了。谢谢你:)
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 2015-04-01
    • 2022-01-04
    • 2017-04-15
    • 2020-07-06
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多