提问者:小点点

‘传递%2的项目数错误,位置暗示%1’操作两列时pandas dataframe出错


我有数据框架--为了示例数据的目的,每天只有10分钟:

                Date    Close
0   2019-06-20 07:00:00 2927.25
1   2019-06-20 07:05:00 2927.00
2   2019-06-20 07:10:00 2926.75
183 2019-06-21 07:00:00 2932.25
184 2019-06-21 07:05:00 2932.25
185 2019-06-21 07:10:00 2931.00
366 2019-06-24 07:00:00 2941.75
367 2019-06-24 07:05:00 2942.25
368 2019-06-24 07:10:00 2941.50
549 2019-06-25 07:00:00 2925.50
550 2019-06-25 07:05:00 2926.50
551 2019-06-25 07:10:00 2926.50
732 2019-06-26 07:00:00 2903.25

我想要得到收盘价的每日范围。
我按天对数据进行分组,并得到收盘价的最小值和最大值:

rangeofday = df.groupby(pd.Grouper(key='Date', freq='1D')).agg({'Close':[np.min, np.max]})
rangeofday = rangeofday.dropna()

            Close
            amin    amax
Date        
2019-06-20  2926.75 2927.25
2019-06-21  2931.00 2932.25
2019-06-24  2941.50 2942.25
2019-06-25  2925.50 2926.50
2019-06-26  2903.25 2904.00
... ... ...

到目前为止还不错,但是发生的情况是列的名称很奇怪,而且不知为何不能通过名称访问。

    rangeofday.amin
or
    rangeofday.Closeamin

    = 'DataFrame' object has no attribute 'amin'

这样我就可以用ILOC访问它们:

rangeofday.iloc[:, [1]]

            Close
            amax
Date    
2019-06-20  2927.25
2019-06-21  2932.25
2019-06-24  2942.25
2019-06-25  2926.50

现在我试着从max中减去min:

rangeofday['range'] = (rangeofday.iloc[:, [0]] - rangeofday.iloc[:, [1]])/0.25

并得到错误:

Wrong number of items passed 2, placement implies 1

这意味着什么?如何绕过这个错误?


共1个答案

匿名用户

由于您应用了多个agg函数,因此pandas自动将一个multiindex应用到您的分组框架。 详情请参阅https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html

特别是,如果要访问列,可以通过将列名作为元组传递来访问:

RangeOfDay[('clos','amax')]

RangeOfDay.loc[:,('clos','amin')]