我的数据框(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)
但是无法解决任何问题。任何指导都将非常感谢。
由于
答案 0 :(得分:10)
您可以使用numpy.log。 Math.log期待一个数字,而不是数组。
答案 1 :(得分:7)
您可以使用lambda运算符将函数应用于熊猫数据框或系列。更具体地说,如果要将列中的每个元素都转换为浮点数,则应执行以下操作:
df['A'].apply(lambda x: float(x))
在这里,lambda运算符将获取该列上的值(作为x),并将其作为浮点值返回。
答案 2 :(得分:0)
如果您只是写df["A"].astype(float)
,则不会更改df
。您需要将astype
方法调用的输出分配给其他内容,包括使用df['A'] = df['A'].astype(float)
分配给现有系列。另外你可能想要使用numpy作为@ user3582076建议,或者在系列上使用.apply
,因为将今天的值除以昨天的值。
答案 3 :(得分:0)
我遇到了同样的问题,对我来说,答案是看为什么我首先拥有系列剧的原因。在花了很长时间寻找如何将系列更改为不同的分配数据类型后,我意识到我在数据框中两次定义了相同的列名,这就是为什么要创建一个系列。
删除列名的意外重复可消除此问题:)
答案 4 :(得分:0)
我使用的方式不同,但与@cemosambora相同
(df.A).apply(lambda x: float(x))
这里,df
是熊猫数据框,A
是列名