【问题标题】:TypeError: cannot convert the series to <class 'float'>TypeError:无法将系列转换为 <class 'float'>
【发布时间】:2021-04-19 01:54:55
【问题描述】:

我有一个如下所示的数据框 (df):

date                 A
2001-01-02      1.0022
2001-01-03      1.1033
2001-01-04      1.1496
2001-01-05      1.1033

2015-03-30    126.3700
2015-03-31    124.4300
2015-04-01    124.2500
2015-04-02    124.8900

对于整个时间序列,我尝试将今天的值除以昨天并使用以下命令记录结果:

df["B"] = math.log(df["A"] / df["A"].shift(1))

但是我得到以下错误:

TypeError: cannot convert the series to <class 'float'>

我该如何解决这个问题?我尝试使用以下方法将其转换为浮点数:

df["B"] .astype(float)

但是什么都做不了。

【问题讨论】:

  • 检查是否有任何非浮点值,如空字符串或非数字字符串
  • math.log 需要一个浮点值。它不适用于 pandas Series 对象。
  • 你能不能试着把一小部分数据转换成浮点数,看看是否可行
  • 为什么不 df["B"] = (df["A"] / df["A"].shift(1)).apply(lambda x: math.log(x)) ?

标签: python python-3.x


【解决方案1】:

您可以改用 numpy.log。 Math.log 需要一个数字,而不是数组。

【讨论】:

    【解决方案2】:

    您可以使用 lambda 运算符将您的函数应用于 pandas 数据框或系列。更具体地说,如果您想将列上的每个元素转换为浮点数,您应该这样做:

    df['A'].apply(lambda x: float(x))
    

    这里 lambda 运算符将获取该列上的值(作为 x)并将它们作为浮点值返回。

    【讨论】:

    • 感谢您分享您的答案。你的解决方案对我有用。
    • 假设您只想考虑x 是数字的情况?你如何在 lambda 中适应它?
    【解决方案3】:

    如果你只写df["A"].astype(float),你不会改变df。您需要将astype 方法调用的输出分配给其他内容,包括使用df['A'] = df['A'].astype(float) 的现有系列。此外,您可能希望按照 @user3582076 的建议使用 numpy,或者在将今天的值除以昨天的值的系列上使用 .apply

    【讨论】:

      【解决方案4】:

      我有同样的问题,对我来说,答案是首先看看我为什么要制作系列的原因。在寻找了很长时间关于如何将系列更改为不同的分配数据类型之后,我意识到我在数据框中定义了两次相同的列名,这就是我有一个系列的原因。

      删除意外重复的列名可以解决此问题 :)

      【讨论】:

      • 这也是我的情况 - 我的数据框被修改了两次以通过函数添加具有相同名称的列,一次在整个 df 上,一次在子集视图上。添加一个 copy() 解决了这个问题。
      【解决方案5】:

      我以不同的方式使用,但它与@cemosambora 相同

      (df.A).apply(lambda x: float(x)) 这里,df 是 pandas 数据框,A 是列名

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 2017-10-16
        • 1970-01-01
        相关资源
        最近更新 更多