【问题标题】:Looping over a MultiIndex in pandas循环遍历熊猫中的 MultiIndex
【发布时间】:2014-09-08 13:31:47
【问题描述】:

我有一个 MultiIndexed DataFrame df1,并希望以这样的方式循环它,以便在循环的每个实例中都有一个带有常规非分层索引的 DataFrame,它是对应于外部索引的 df1 的子集条目。即,如果我有:

我想得到

随后是 C1、C2 等。我也不知道它们的实际名称是什么(C1 等,在这里只是占位符),所以只想循环 Ci 值我有。

我一直在纠结iterrows 和各种循环,没有得到任何切实的结果,也不知道如何继续。我觉得应该存在一个简单的解决方案,但在文档中找不到任何看起来有用的东西,可能是由于我自己缺乏理解。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    使用来自here的修改示例

    In [30]: def mklbl(prefix,n):
            return ["%s%s" % (prefix,i)  for i in range(n)]
       ....: 
    
    In [31]: columns = MultiIndex.from_tuples([('a','foo'),('a','bar'),
                                      ('b','foo'),('b','bah')],
                                       names=['lvl0', 'lvl1'])
    
    In [33]: index = MultiIndex.from_product([mklbl('A',4),mklbl('B',2)])
    
    In [34]: df = DataFrame(np.arange(len(index)*len(columns)).reshape((len(index),len(columns))),
                   index=index,
                   columns=columns).sortlevel().sortlevel(axis=1)
    
    In [35]: df
    Out[35]: 
    lvl0     a         b     
    lvl1   bar  foo  bah  foo
    A0 B0    1    0    3    2
       B1    5    4    7    6
    A1 B0    9    8   11   10
       B1   13   12   15   14
    A2 B0   17   16   19   18
       B1   21   20   23   22
    A3 B0   25   24   27   26
       B1   29   28   31   30
    
    In [36]: df.loc['A0']
    Out[36]: 
    lvl0    a         b     
    lvl1  bar  foo  bah  foo
    B0      1    0    3    2
    B1      5    4    7    6
    
    In [37]: df.loc['A1']
    Out[37]: 
    lvl0    a         b     
    lvl1  bar  foo  bah  foo
    B0      9    8   11   10
    B1     13   12   15   14
    

    不需要循环。

    您也可以选择这些以返回帧(使用原始 MI) 例如df.loc[['A1']]

    如果要获取索引中的值:

    In [38]: df.index.get_level_values(0).unique()
    Out[38]: array(['A0', 'A1', 'A2', 'A3'], dtype=object)
    

    【讨论】:

    • 谢谢,如果我知道标签是什么,那确实有效,但如果我不知道该怎么办? IE。我不知道索引的名称(在我的问题中,它们(在您的示例中为 A)是至少发生一个事件的分钟数,而子索引(在您的示例中为 B)包含发生特定事件的秒数)。我不知道事件何时发生。此外,您的示例不会遍历索引的所有元素,我想每分钟循环一次。
    • 已更新以显示如何获取级别值。如果你真的想循环,循环很简单。
    • @jeff 你能看看这个use case吗?
    【解决方案2】:

    您是否正在尝试做这样的事情?

    for i in set(df.index):
        print df.loc[i].reset_index()
    
    1. set(df.index) 返回多索引(分层索引)的一组唯一元组。
    2. df.loc[i].reset_index()...df.loc[i] 当然会返回原始数据帧的子集,.reset_index() 部分会将索引转换为列

    【讨论】:

    • 对一个相关问题非常有用:如何将多索引转换为可迭代的元组。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2021-12-18
    • 2020-03-06
    • 1970-01-01
    • 2017-06-08
    • 2017-01-15
    相关资源
    最近更新 更多