如何使用索引迭代pandas multiindex数据帧

Yan*_*uru 50 python pandas

我有一个数据框df,看起来像这样.日期和时间是2个多级索引

                           observation1   observation2
date          Time                             
2012-11-02    9:15:00      79.373668      224
              9:16:00      130.841316     477
2012-11-03    9:15:00      45.312814      835
              9:16:00      123.776946     623
              9:17:00      153.76646      624
              9:18:00      463.276946     626
              9:19:00      663.176934     622
              9:20:00      763.77333      621
2012-11-04    9:15:00      115.449437     122
              9:16:00      123.776946     555
              9:17:00      153.76646      344
              9:18:00      463.276946     212
Run Code Online (Sandbox Code Playgroud)

我想在每日数据块上做一些复杂的过程.

Psuedo代码看起来像

 for count in df(level 0 index) :
     new_df = get only chunk for count
     complex_process(new_df)
Run Code Online (Sandbox Code Playgroud)

所以,首先,我找不到只访问日期块的方法

2012-11-03    9:15:00      45.312814      835
              9:16:00      123.776946     623
              9:17:00      153.76646      624
              9:18:00      463.276946     626
              9:19:00      663.176934     622
              9:20:00      763.77333      621
Run Code Online (Sandbox Code Playgroud)

然后发送它进行处理.我在for循环中执行此操作,因为我不确定是否有任何方法可以在不提及0级列的确切值的情况下执行此操作.我做了一些基本的搜索并且能够获得df.index.get_level_values(0),但是它返回了我所有的值并且导致循环一天运行多次.我想每天创建一个数据帧并发送它进行处理.

chr*_*isb 82

一种简单的方法是分组索引的第一级 - 迭代groupby对象将返回组密钥和包含每个组的子帧.

In [136]: for date, new_df in df.groupby(level=0):
     ...:     print(new_df)
     ...:     
                    observation1  observation2
date       Time                               
2012-11-02 9:15:00     79.373668           224
           9:16:00    130.841316           477

                    observation1  observation2
date       Time                               
2012-11-03 9:15:00     45.312814           835
           9:16:00    123.776946           623
           9:17:00    153.766460           624
           9:18:00    463.276946           626
           9:19:00    663.176934           622
           9:20:00    763.773330           621

                    observation1  observation2
date       Time                               
2012-11-04 9:15:00    115.449437           122
           9:16:00    123.776946           555
           9:17:00    153.766460           344
           9:18:00    463.276946           212
Run Code Online (Sandbox Code Playgroud)


小智 7

那这个呢?

for idate in df.index.get_level_values('date'):
    complex_process(df.ix[idate], idate)
Run Code Online (Sandbox Code Playgroud)

  • 我认为 `df.index.get_level_values('date').unique()` 可能会更好,正如 @melbay 指出的那样。 (3认同)

小智 5

标记@psorenson 答案,我们可以获得唯一级别索引及其相关数据帧切片,无需 numpy,如下所示:

for date in df.index.get_level_values('date').unique():
    print(df.loc[date])
Run Code Online (Sandbox Code Playgroud)