Indice panda DataFrame dalla colonna di numeri, quando i nomi di colonna sono numeri interi

Sto cercando di mantenere solo determinate colonne di un DataFrame, e funziona bene quando i nomi di colonna sono stringhe:

In [2]: import numpy as np

In [3]: import pandas as pd

In [4]: a = np.arange(35).reshape(5,7)

In [5]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], ['a', 'b', 'c', 'd', 'e', 'f', 'g'])

In [6]: df
Out[6]: 
    a   b   c   d   e   f   g
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [7]: df[[1,3]] #No problem
Out[7]: 
    b   d
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

Tuttavia, quando i nomi di colonna sono numeri interi, ricevo un errore di chiave:

In [8]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17))

In [9]: df
Out[9]: 
   10  11  12  13  14  15  16
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [10]: df[[1,3]]

Risultati:

KeyError: '[1 3] not in index'

Posso vedere perché il panda non lo consente -> per evitare di mescolare tra di indicizzazione dai nomi di colonna e colonna di numeri. Tuttavia, c’è un modo per raccontare la panda che voglio indice di colonna di numeri? Naturalmente, una soluzione è quella di convertire i nomi di colonna per le stringhe, ma mi chiedo se c’è una soluzione migliore.

InformationsquelleAutor Akavall | 2014-11-26

2 Replies
  1. 10

    Questo è esattamente lo scopo di iloc, vedere qui

    In [37]: df
    Out[37]: 
       10  11  12  13  14  15  16
    x   0   1   2   3   4   5   6
    y   7   8   9  10  11  12  13
    u  14  15  16  17  18  19  20
    z  21  22  23  24  25  26  27
    w  28  29  30  31  32  33  34
    
    In [38]: df.iloc[:,[1,3]]
    Out[38]: 
       11  13
    x   1   3
    y   8  10
    u  15  17
    z  22  24
    w  29  31

    InformationsquelleAutor Jeff

  2. 2

    Questa è certamente una di quelle cose che si sente come un bug, ma è davvero una decisione di progettazione (credo).

    Un paio di aggirare opzioni:

    rinominare le colonne con le loro posizioni, come il loro nome:

     df.columns = arange(0,len(df.columns))

    Un altro modo è quello di ottenere i nomi da df.columns:

    print df[ df.columns[[1,3]] ]
       11  13
    x   1   3
    y   8  10
    u  15  17
    z  22  24
    w  29  31

    Ho il sospetto che questo è il più attraente in quanto richiede solo l’aggiunta di un pochino di codice e non cambiare tutti i nomi di colonna.

    InformationsquelleAutor JD Long

Lascia un commento