Skip to main content
 首页 » 编程设计

python之Pandas DataFrame 中索引和列的级别数(深度)

2025年05月04日12JustinYoung

Python Pandas DataFrame 可以有分层索引(MultiIndex)或分层列。

我正在寻找一种方法来了解索引和列的级别数(深度)。

len(df.index.levels) 

似乎只适用于 MultiIndex 但它不适用于普通索引。

是否有一个属性(适用于 MultiIndex 但也适用于简单的 Index)?

df.index.depth 

或

df.columns.depth 

会很棒。

MultiIndex 列和索引的一个示例:

import pandas as pd 
import numpy as np 
 
def mklbl(prefix,n): 
    return ["%s%s" % (prefix,i)  for i in range(n)] 
 
def mi_sample(): 
    miindex = pd.MultiIndex.from_product([mklbl('A',4), 
                                       mklbl('B',2), 
                                       mklbl('C',4), 
                                       mklbl('D',2)]) 
 
 
    micolumns = pd.MultiIndex.from_tuples([('a','foo'),('a','bar'), 
                                        ('b','foo'),('b','bah')], 
                                         names=['lvl0', 'lvl1']) 
 
    dfmi = pd.DataFrame(np.arange(len(miindex)*len(micolumns)).reshape((len(miindex),len(micolumns))), 
                 index=miindex, 
                 columns=micolumns).sortlevel().sortlevel(axis=1) 
    return(dfmi) 
 
df = mi_sample() 

所以 df 看起来像:

lvl0           a         b 
lvl1         bar  foo  bah  foo 
A0 B0 C0 D0    1    0    3    2 
         D1    5    4    7    6 
      C1 D0    9    8   11   10 
         D1   13   12   15   14 
      C2 D0   17   16   19   18 
         D1   21   20   23   22 
      C3 D0   25   24   27   26 
         D1   29   28   31   30 
   B1 C0 D0   33   32   35   34 
         D1   37   36   39   38 
      C1 D0   41   40   43   42 
         D1   45   44   47   46 
      C2 D0   49   48   51   50 
         D1   53   52   55   54 
      C3 D0   57   56   59   58 
         D1   61   60   63   62 
A1 B0 C0 D0   65   64   67   66 
         D1   69   68   71   70 
      C1 D0   73   72   75   74 
         D1   77   76   79   78 
      C2 D0   81   80   83   82 
         D1   85   84   87   86 
      C3 D0   89   88   91   90 
         D1   93   92   95   94 
   B1 C0 D0   97   96   99   98 
         D1  101  100  103  102 
      C1 D0  105  104  107  106 
         D1  109  108  111  110 
      C2 D0  113  112  115  114 
         D1  117  116  119  118 
...          ...  ...  ...  ... 
A2 B0 C1 D0  137  136  139  138 
         D1  141  140  143  142 
      C2 D0  145  144  147  146 
         D1  149  148  151  150 
      C3 D0  153  152  155  154 
         D1  157  156  159  158 
   B1 C0 D0  161  160  163  162 
         D1  165  164  167  166 
      C1 D0  169  168  171  170 
         D1  173  172  175  174 
      C2 D0  177  176  179  178 
         D1  181  180  183  182 
      C3 D0  185  184  187  186 
         D1  189  188  191  190 
A3 B0 C0 D0  193  192  195  194 
         D1  197  196  199  198 
      C1 D0  201  200  203  202 
         D1  205  204  207  206 
      C2 D0  209  208  211  210 
         D1  213  212  215  214 
      C3 D0  217  216  219  218 
         D1  221  220  223  222 
   B1 C0 D0  225  224  227  226 
         D1  229  228  231  230 
      C1 D0  233  232  235  234 
         D1  237  236  239  238 
      C2 D0  241  240  243  242 
         D1  245  244  247  246 
      C3 D0  249  248  251  250 
         D1  253  252  255  254 
 
[64 rows x 4 columns] 

请您参考如下方法:

要对上面的评论进行总结:

您可以使用 .nlevels 属性来给出索引和列的级别数:

df = pd.DataFrame(np.random.rand(2,2), index=[['A','A'],['B','C']], columns=['a','b']) 
df 
     a      b 
A B  0.558  0.336 
  C  0.148  0.436     
 
df.index.nlevels 
2 
 
df.columns.nlevels 
1 

正如@joris 上面提到的 len(df.columns.levels) 在上面的示例中将不起作用,因为 columns 不是 MultiIndex,给予:

AttributeError: 'Index' object has no attribute 'levels' 

但在上面的例子中,它对 index 会很好地工作:

len(df.index.levels) 
2