Suche…


Wählen Sie aus MultiIndex nach Ebene

Gegeben der folgende 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

Erhalte die Werte von A nach Namen:

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')

Oder nach Anzahl der Stufen:

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')

Und für einen bestimmten Bereich:

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

Der Bereich kann auch mehrere Spalten enthalten:

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

Um einen bestimmten Wert zu extrahieren, können Sie xs (Querschnitt) verwenden:

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

Über DataFrame mit MultiIndex iterieren

Gegeben der folgende 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

Sie können nach jeder Ebene des MultiIndex iterieren. Beispiel: level=0 (Sie können die Ebene auch nach Name auswählen, z. B. 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

Sie können die Ebenen auch über den Namen auswählen, z. B. `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

MultiIndex einstellen und sortieren

Dieses Beispiel zeigt, wie Sie mithilfe von MultiIndex einen MultiIndex in einem 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

Sie können den Index gleich nach dem Festlegen sortieren:

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

Ein sortierter Index führt zu etwas effizienteren Suchvorgängen auf der ersten Ebene:

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

Nachdem der Index festgelegt wurde, können Sie nach bestimmten Datensätzen oder Datensatzgruppen suchen:

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

So ändern Sie MultiIndex-Spalten in Standardspalten

Gegeben ein DataFrame mit MultiIndex-Spalten

# 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

Wenn Sie die Spalten in Standardspalten (nicht MultiIndex) ändern möchten, benennen Sie die Spalten einfach um.

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

So ändern Sie Standardspalten in MultiIndex

Beginnen Sie mit einem Standard-DataFrame

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

Um nun zu MultiIndex zu wechseln, erstellen Sie ein MultiIndex Objekt, und weisen Sie es 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

MultiIndex-Spalten

MultiIndex kann auch zum Erstellen von DataFrames mit mehrstufigen Spalten verwendet werden. Verwenden Sie einfach die columns Schlüsselwort in dem Datenframe - Befehl.

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

Anzeige aller Elemente im Index

Um alle Elemente im Index anzuzeigen, ändern Sie die Druckoptionen, die die Anzeige des MultiIndex sparsifizieren.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow