【问题标题】:How to iterate over pandas multiindex dataframe using index如何使用索引迭代熊猫多索引数据帧
【发布时间】:2014-11-13 18:38:55
【问题描述】:

我有一个看起来像这样的数据框 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

我想在每日数据块上运行一些复杂的过程。

伪代码看起来像

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    另一种选择:

    for date in df.index.levels[0]:
        print(df.loc[date])
    

    与@sanzoghenzo 提出的df.index.unique("date") 的区别在于它通过编号而不是名称来引用索引级别。

    【讨论】:

      【解决方案2】:

      晚会,我发现以下方法也有效:

      for date in df.index.unique("date"):
          print(df.loc[date])
      

      它使用 0.23.0 版本中引入的Index.unique methodlevel 可选参数。

      您可以指定级别编号或标签。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          这个怎么样?

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

          【讨论】:

          • 谨慎使用此解决方案,请注意 idate 的每个值都可以被多次命中。你应该在 np.unique(df.index.get_level_values('date')) 中为 idate 做:注意额外的 np.unique。
          • 我认为df.index.get_level_values('date').unique() 可能会更好,正如@melbay 指出的那样。
          【解决方案5】:

          一种简单的方法是分组索引的第一级 - 遍历 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
          

          【讨论】:

          • 这有帮助!我遵循的是相当迂回的方式 - 首先找到索引标签,然后使用 iloc 对其进行切片。
          • 在我生命的最后 3 年里,这在哪里。这么干净的方法谢谢!
          • 这个方法很简洁,但是如何将这些子帧的更改应用到主数据帧?通过 loc 或 iloc 搜索它会使计算变得非常慢。
          • @Manaslu 如果您可以将更改包装成一个您可以使用的函数df.groupby('key').apply(function)
          • 太棒了!快速而干净的方式来解决问题。这比迭代日期和获取df.loc[date] 快得多。
          猜你喜欢
          • 2020-01-14
          • 2021-06-08
          • 2016-03-08
          • 2015-02-22
          • 1970-01-01
          • 2016-06-13
          • 1970-01-01
          • 1970-01-01
          • 2020-08-30
          相关资源
          最近更新 更多