簡體   English   中英

pandas Dataframe 創建新列

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM