Buscar..


Seleccione de MultiIndex por Nivel

Dado el siguiente DataFrame:

In [11]: df = pd.DataFrame(np.random.randn(6, 3), columns=['A', 'B', 'C'])

In [12]: df.set_index(['A', 'B'], inplace=True)

In [13]: df
Out[13]: 
                            C
A         B                  
 0.902764 -0.259656 -1.864541
-0.695893  0.308893  0.125199
 1.696989 -1.221131 -2.975839
-1.132069 -1.086189 -1.945467
 2.294835 -1.765507  1.567853
-1.788299  2.579029  0.792919

Obtenga los valores de A , por nombre:

In [14]: df.index.get_level_values('A')
Out[14]: 
Float64Index([0.902764041011, -0.69589264969,  1.69698924476, -1.13206872067,
               2.29483481146,   -1.788298829],
             dtype='float64', name='A')

O por número de nivel:

In [15]: df.index.get_level_values(level=0)
Out[15]: 
Float64Index([0.902764041011, -0.69589264969,  1.69698924476, -1.13206872067,
               2.29483481146,   -1.788298829],
             dtype='float64', name='A')

Y para un rango específico:

In [16]: df.loc[(df.index.get_level_values('A') > 0.5) & (df.index.get_level_values('A') < 2.1)]
Out[16]:
                           C
A        B                  
0.902764 -0.259656 -1.864541
1.696989 -1.221131 -2.975839

El rango también puede incluir múltiples columnas:

In [17]: df.loc[(df.index.get_level_values('A') > 0.5) & (df.index.get_level_values('B') < 0)]
Out[17]: 
                           C
A        B                  
0.902764 -0.259656 -1.864541
1.696989 -1.221131 -2.975839
2.294835 -1.765507  1.567853

Para extraer un valor específico puede usar xs (sección transversal):

In [18]: df.xs(key=0.9027639999999999)
Out[18]:
                  C
B
-0.259656 -1.864541

In [19]: df.xs(key=0.9027639999999999, drop_level=False)
Out[19]:
                           C
A        B
0.902764 -0.259656 -1.864541

Iterar sobre DataFrame con MultiIndex

Dado el siguiente DataFrame:

In [11]: df = pd.DataFrame({'a':[1,1,1,2,2,3],'b':[4,4,5,5,6,7,],'c':[10,11,12,13,14,15]})

In [12]: df.set_index(['a','b'], inplace=True)

In [13]: df
Out[13]: 
      c
a b    
1 4  10
  4  11
  5  12
2 5  13
  6  14
3 7  15

Puedes iterar por cualquier nivel del MultiIndex. Por ejemplo, level=0 (también puede seleccionar el nivel por nombre, por ejemplo, level='a' ):

In[21]: for idx, data in df.groupby(level=0):
            print('---')
            print(data)
---
      c
a b    
1 4  10
  4  11
  5  12
---
      c
a b    
2 5  13
  6  14
---
      c
a b    
3 7  15

También puede seleccionar los niveles por nombre, por ejemplo `level = 'b':

In[22]: for idx, data in df.groupby(level='b'):
            print('---')
            print(data)
---     
      c
a b    
1 4  10
  4  11
---
      c
a b    
1 5  12
2 5  13
---
      c
a b    
2 6  14
---
      c
a b    
3 7  15

Configuración y clasificación de un MultiIndex

Este ejemplo muestra cómo usar los datos de columna para establecer un MultiIndex en un pandas.DataFrame .

In [1]: df = pd.DataFrame([['one', 'A', 100], ['two', 'A', 101], ['three', 'A', 102],
   ...:                    ['one', 'B', 103], ['two', 'B', 104], ['three', 'B', 105]],
   ...:                   columns=['c1', 'c2', 'c3'])


In [2]: df
Out[2]: 
      c1 c2   c3
0    one  A  100
1    two  A  101
2  three  A  102
3    one  B  103
4    two  B  104
5  three  B  105



In [3]: df.set_index(['c1', 'c2'])
Out[3]: 
           c3
c1    c2     
one   A   100
two   A   101
three A   102
one   B   103
two   B   104
three B   105

Puede ordenar el índice justo después de establecerlo:

In [4]: df.set_index(['c1', 'c2']).sort_index()
Out[4]: 
           c3
c1    c2     
one   A   100
      B   103
three A   102
      B   105
two   A   101
      B   104

Tener un índice ordenado, dará como resultado búsquedas un poco más eficientes en el primer nivel:

In [5]: df_01 = df.set_index(['c1', 'c2'])

In [6]: %timeit df_01.loc['one']
1000 loops, best of 3: 607 µs per loop


In [7]: df_02 = df.set_index(['c1', 'c2']).sort_index()

In [8]: %timeit df_02.loc['one']
1000 loops, best of 3: 413 µs per loop

Una vez que se ha establecido el índice, puede realizar búsquedas para registros específicos o grupos de registros:

In [9]: df_indexed = df.set_index(['c1', 'c2']).sort_index()

In [10]: df_indexed.loc['one']
Out[10]: 
     c3
c2     
A   100
B   103


In [11]: df_indexed.loc['one', 'A']
Out[11]: 
c3    100
Name: (one, A), dtype: int64


In [12]: df_indexed.xs((slice(None), 'A'))
Out[12]: 
        c3
c1        
one    100
three  102
two    101

Cómo cambiar columnas MultiIndex a columnas estándar

Dado un DataFrame con columnas MultiIndex

# build an example DataFrame
midx = pd.MultiIndex(levels=[['zero', 'one'], ['x','y']], labels=[[1,1,0,],[1,0,1,]])
df = pd.DataFrame(np.random.randn(2,3), columns=midx)

In [2]: df
Out[2]: 
        one                zero
          y         x         y
0  0.785806 -0.679039  0.513451
1 -0.337862 -0.350690 -1.423253

Si desea cambiar las columnas a columnas estándar (no MultiIndex), simplemente cambie el nombre de las columnas.

df.columns = ['A','B','C']
In [3]: df
Out[3]: 
          A         B         C
0  0.785806 -0.679039  0.513451
1 -0.337862 -0.350690 -1.423253

Cómo cambiar columnas estándar a MultiIndex

Comience con un DataFrame estándar

df = pd.DataFrame(np.random.randn(2,3), columns=['a','b','c'])

In [91]: df
Out[91]: 
          a         b         c
0 -0.911752 -1.405419 -0.978419
1  0.603888 -1.187064 -0.035883

Ahora para cambiar a MultiIndex, cree un objeto MultiIndex y df.columns a df.columns .

midx = pd.MultiIndex(levels=[['zero', 'one'], ['x','y']], labels=[[1,1,0,],[1,0,1,]])
df.columns = midx

In [94]: df
Out[94]: 
            one                zero
              y         x         y
    0 -0.911752 -1.405419 -0.978419
    1  0.603888 -1.187064 -0.035883

Columnas multiindex

MultiIndex también se puede utilizar para crear DataFrames con columnas multinivel. Simplemente use la palabra clave de las columns en el comando DataFrame.

midx = pd.MultiIndex(levels=[['zero', 'one'], ['x','y']], labels=[[1,1,0,],[1,0,1,]])
df = pd.DataFrame(np.random.randn(6,4), columns=midx)

In [86]: df
Out[86]: 
        one                zero
          y         x         y
0  0.625695  2.149377  0.006123
1 -1.392909  0.849853  0.005477

Visualización de todos los elementos en el índice.

Para ver todos los elementos en el índice, cambie las opciones de impresión que "clasifican" la visualización del MultiIndex.

pd.set_option('display.multi_sparse', False)
df.groupby(['A','B']).mean()
# Output:
#        C
# A B
# a 1  107
# a 2  102
# a 3  115
# b 5   92
# b 8   98
# c 2   87
# c 4  104
# c 9  123


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow