在for循环

时间:2017-10-10 13:30:04

标签: python pandas for-loop

目标:将N个int的列表传递给函数,并将这些int用于1)。在pandas数据框中创建并命名N列; 2)。使用这些整数作为回顾期来计算滚动平均值。

这是函数的代码(带有重复数据拉取):

import pandas as pd
import pandas_datareader as web

test_df = web.DataReader('GDP', data_source = 'fred')

def sma(df, sma_lookbacks = [1,2]):
    import pandas as pd

    df = pd.DataFrame(df)
    df = df.dropna()

    for lookback in sma_lookbacks:
        df[str('SMA' + str(lookback))] = df.rolling(window = lookback).mean() 
    return df.tail()

sma(test_df)

收到错误:

  

ValueError:传递的项目数量错误2,展示位置意味着1

我这里有逻辑问题吗?我相信for循环它应该不是一次顺序传递int,所以我不太明白它是如何一次传递多个值的。因此,我不确定如何进行问题排查。

根据这篇文章,当您同时将多个值传递给只能获取一个值的容器时,会抛出此错误。不应该是for循环地址吗? ValueError: Wrong number of items passed - Meaning and suggestions?

1 个答案:

答案 0 :(得分:2)

我认为在分配应用于数据帧的函数返回的值之前,pandas会搜索列名。因此,在将函数返回到该列的系列分配之前,在开头用一些标量初始化该列,即

import pandas as pd
import pandas_datareader as web

test_df = web.DataReader('GDP', data_source = 'fred')

def sma(df, sma_lookbacks = [1,2]):

    df = pd.DataFrame(df)
    df = df.dropna()

    for lookback in sma_lookbacks:
        df[str('SMA' + str(lookback))] = 0
        df[str('SMA' + str(lookback))] = df.rolling(window = lookback).mean() 
    return df.tail()
               GDP     SMA1      SMA2
DATE                                  
2016-04-01  18538.0  18538.0  18431.60
2016-07-01  18729.1  18729.1  18633.55
2016-10-01  18905.5  18905.5  18817.30
2017-01-01  19057.7  19057.7  18981.60
2017-04-01  19250.0  19250.0  19153.85