[英]pandas Dataframe create new column
我有与 pandas dataframe 一起使用的代码片段,我正在尝试使用应用 function 创建一个名为 STDEV 的新列,该列运行错误
TypeError: ("'float' object is not iterable", 'occurred at index 0')
有人可以帮我理解为什么我不断收到这个错误
def sigma(df):
val = df.volume2Sum / df.volumeSum - df.vwap * df.vwap
return math.sqrt(max(val))
df['STDEV_TV'] = df.apply(sigma, axis=1)
尝试:
import pandas as pd
import numpy as np
import math
df = pd.DataFrame(np.random.randint(1, 10, (5, 3)),
columns=['volume2Sum', 'volumeSum', 'vwap'])
def sigma(df):
val = df.volume2Sum / df.volumeSum - df.vwap * df.vwap
return math.sqrt(val) if val >= 0 else val
df['STDEV_TV'] = df.apply(sigma, axis=1)
Output:
>>> df
volume2Sum volumeSum vwap STDEV_TV
0 4 5 8 -63.200000
1 2 8 4 -15.750000
2 3 3 3 -8.000000
3 8 3 4 -13.333333
4 4 2 3 -7.000000
改变
return math.sqrt(max(val))
至
return math.sqrt(val)
max()
遍历一个可迭代对象并找到最大值。 这里的问题是,由于您将sigma
应用于每一行,因此局部变量val
是一个浮点数,而不是一个列表,所以您拥有的类似于max(1.3)
。
您需要将 sigma 应用于每组值,而不是整个 DataFrame。 我会使用 lambda function,例如:
def sigma(volume2Sum, volumeSum, vwap):
val = volume2Sum / volumeSum - vwap * vwap
return math.sqrt(val)
df['STDEV_TV'] = df.apply(lambda x: sigma(x.volume2Sum, x.volumeSum, x.vwap), axis=1)
这应该将 val 放入 STDEV_TV 列,您可以单独找到最大值。 注意不要取负数的平方根。
结果,您 function sigma 给您一个数字。 因为,第一步你找到最大值:
max(val)
它只是一个数字......之后你尝试使用你的 function 数据系列。 您应该在代码中使用最后一个字符串:
df['STDEV_TV'] = sigma(df)
它会工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.