【问题标题】:Create subset table from Pandas dataframe with hierarchical index in a loop从 Pandas 数据帧中创建子集表,并在循环中使用分层索引
【发布时间】:2014-07-03 13:46:18
【问题描述】:

我想遍历分层索引熊猫数据框并打印基于“group1”级别的子集。

这是我的数据框

df = pd.DataFrame({'group1': ['a','a','a','b','b','b','c','c','d','d','d','d','d'],
                        'group2': ['c','c','d','d','d','e','f','f','e','d','d','d','e'],
                        'value1': [1.1,2,3,4,5,6,7,8,9,1,2,3,4],
                        'value2': [7.1,8,9,10,11,12,43,12,34,5,6,2,3]})

df = df.set_index(['group1', 'group2'])

这就是它的样子:

               value1  value2
group1 group2                
a      c          1.1     7.1
a      c          2.0     8.0
a      d          3.0     9.0
b      d          4.0    10.0
b      d          5.0    11.0
b      e          6.0    12.0
c      f          7.0    43.0
d      f          8.0    12.0
d      e          9.0    34.0
d      d          1.0     5.0
d      d          2.0     6.0
d      d          3.0     2.0
d      e          4.0     3.0

我可以像这样基于 group1 成功打印一个 SINGLE 子集:

print df.xs('a', level=0)  

        value1  value2
group2                
c          1.1     7.1
c          2.0     8.0
d          3.0     9.0

但是我怎样才能把它放在一个循环中为'group1'中的每组元素打印一个子集呢?

我的失败尝试:

for group1, group2 in df.index: 
    print df.xs(group1, level=0)

这为每个索引打印了一个子集,而不是将它们组合在一起(希望有意义)。

【问题讨论】:

    标签: python loops pandas subset multi-index


    【解决方案1】:

    在索引上使用 get_level_values 以仅返回该级别的那些索引值,另外调用 unique 因为返回的是每个子级别行的重复索引值。

    In [35]:
    
    for gp in df.index.get_level_values(0).unique():
        print (df.xs(gp, level=0))
            value1  value2
    group2                
    c          1.1     7.1
    c          2.0     8.0
    d          3.0     9.0
    
    [3 rows x 2 columns]
            value1  value2
    group2                
    d            4      10
    d            5      11
    e            6      12
    
    [3 rows x 2 columns]
            value1  value2
    group2                
    f            7      43
    f            8      12
    
    [2 rows x 2 columns]
            value1  value2
    group2                
    e            9      34
    d            1       5
    d            2       6
    d            3       2
    e            4       3
    
    [5 rows x 2 columns]
    

    【讨论】:

      【解决方案2】:

      这就是groupby 的用途(迭代为您提供组名、组):

      In [13]: for g, grp in df.groupby(level='group1'):
          print grp
         ....:     
                     value1  value2
      group1 group2                
      a      c          1.1     7.1
             c          2.0     8.0
             d          3.0     9.0
                     value1  value2
      group1 group2                
      b      d            4      10
             d            5      11
             e            6      12
                     value1  value2
      group1 group2                
      c      f            7      43
             f            8      12
                     value1  value2
      group1 group2                
      d      e            9      34
             d            1       5
             d            2       6
             d            3       2
             e            4       3
      

      但大多数时候你确实想用它做点什么,例如

      df.groupby(level='group1').sum()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-15
        • 2014-02-04
        • 2018-10-01
        • 2018-01-18
        • 2023-03-06
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多