2014-09-19 111 views
24

我有一个数据框架df看起来像这样。日期和时间是2多级索引如何迭代pandas multiindex数据框使用索引

      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 

我想对日常数据块做一些复杂的处理。

的伪代码看起来像

for count in df(level 0 index) : 
    new_df = get only chunk for count 
    complex_process(new_df) 

所以,首先,我无法找到一种方法来访问仅几个街区的日期

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 

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

回答

37

一个简单的方法是groupby第一级索引 - 迭代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 
+0

这有助于!我非常迂回地走 - 首先找到索引标签,然后用iloc切片。 – Yantraguru 2014-09-21 14:08:35

4

这是怎么回事?

for idate in df.index.get_level_values('date'): 
    complex_process(df.ix[idate], idate) 
+1

小心使用此解决方案,请注意每个idate值可能会被命中多倍。 您应该在np.unique(df.index.get_level_values('date'))中为idate做 : 注意其他np.unique。 – 2016-06-02 09:02:11

+0

我觉得'df.index.get_level_values('date')。unique()'可能更好,因为@melbay指出。 – 2018-01-11 19:53:09

0

标记功能@psorenson答案,我们可以得到独特的水平指数和无numpy的它的相关数据帧的片如下:

for date in df.index.get_level_values('date').unique(): 
    print(df.loc[date]) 
相关问题