【问题标题】:How to iterate over multiindex rows?如何迭代多索引行?
【发布时间】:2020-02-29 08:14:59
【问题描述】:

我有以下数据:

                     Adj Close  year  
Date       month day                   
1989-01-03 1     3     1.164242  1989  
1989-01-04 1     4     1.211100  1989  
1989-01-05 1     5     1.218310  1989  
1989-01-06 1     6     1.229123  1989  
1989-01-09 1     9     1.239936  1989  
...                         ...   ...  
2007-01-25 1     25   10.753074  2007  
2007-01-26 1     26   10.644608  2007  
2007-01-29 1     29   10.714428  2007  
2007-01-30 1     30   10.665804  2007  
2007-01-31 1     31   10.688246  2007  

有三个索引,但我想迭代两个索引值月和日。我想像这样查找和存储数据:

对于第 1 个月,在 Adj Close 上查找第 1 天的所有 .mean()

这应该在第 1 个月到第 12 个月的所有日子里完成。

我该怎么做?

【问题讨论】:

  • 澄清,您希望找到全年 1 月 1 日的平均值吗?您希望一年中的每一天都这样做吗?
  • df[df.day==1].groupby('month')['adj_close'].mean() 是这样的吗?
  • @ScottBoston 是的,没错!我想要第 1 个月全年第 1 天的平均值。我想在所有年份的 1 月第 2 天再次重复此操作!
  • @Tserenjamts 我尝试了以下data[data.day==1].groupby('month')['adj_close'].mean(),但得到了错误AttributeError: 'DataFrame' object has no attribute 'day'
  • 你的数据框中没有 day 吗?还是有别的名字?

标签: python-3.x pandas pandas-groupby multi-index


【解决方案1】:

IIUC,

这是 5 年的虚拟数据和调整以适应您的输入数据框:

df = pd.DataFrame({'Adj Close':np.random.randint(20,100, 365*5+1)}, index=pd.date_range('2011-01-01', periods=365*5+1))
​
df = df.set_index([df.index.month, df.index.day], append=True).rename_axis(['Date','month','day'])\
  .assign(year=df.index.year)
​

使用groupby可以返回一年366天(一年有闰日)

df.groupby(['month','day'])['Adj Close'].mean()

输出:

month  day
1      1      56.6
       2      53.8
       3      48.0
       4      53.6
       5      70.4
              ... 
12     27     67.2
       28     48.2
       29     74.6
       30     61.0
       31     66.2
Name: Adj Close, Length: 366, dtype: float64

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2014-11-13
    • 1970-01-01
    • 2010-12-05
    • 2019-12-12
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多