[英]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.