Sélection de la colonne pandas par emplacement

101

J'essaie simplement d'accéder aux colonnes pandas nommées par un entier.

Vous pouvez sélectionner une ligne par emplacement à l'aide de df.ix[3].

Mais comment sélectionner une colonne par entier?

Mon dataframe:

df=pandas.DataFrame({'a':np.random.rand(5), 'b':np.random.rand(5)})
Jason Strimpel
la source
Mis à jour pour poser une question.
Jason Strimpel
Dans cet exemple, l'ordre des colonnes peut ne pas être défini. («a» peut être la première ou la deuxième colonne).
user48956

Réponses:

152

Deux approches qui me viennent à l'esprit:

>>> df
          A         B         C         D
0  0.424634  1.716633  0.282734  2.086944
1 -1.325816  2.056277  2.583704 -0.776403
2  1.457809 -0.407279 -1.560583 -1.316246
3 -0.757134 -1.321025  1.325853 -2.513373
4  1.366180 -1.265185 -2.184617  0.881514
>>> df.iloc[:, 2]
0    0.282734
1    2.583704
2   -1.560583
3    1.325853
4   -2.184617
Name: C
>>> df[df.columns[2]]
0    0.282734
1    2.583704
2   -1.560583
3    1.325853
4   -2.184617
Name: C

Edit : La réponse originale suggérait l'utilisation de df.ix[:,2]mais cette fonction est désormais obsolète. Les utilisateurs doivent passer à df.iloc[:,2].

DSM
la source
28
FYI df.ix est maintenant remplacé par df.iloc
yosemite_k
Notez que si vous avez deux colonnes avec le même nom, la méthode df.iloc [:, 2] fonctionne, renvoyer une seule colonne mais la méthode df [df.columns [2]] renverra les deux colonnes avec le même nom.
BobbyG
54

Vous pouvez également utiliser df.icol(n)pour accéder à une colonne par nombre entier.

Mise à jour: icolest obsolète et la même fonctionnalité peut être obtenue en:

df.iloc[:, n]  # to access the column at the nth position
Adrian
la source
2
Notez que pour la prochaine version 0.11.0, ces méthodes sont obsolètes et peuvent être supprimées dans les versions futures. Voir pandas.pydata.org/pandas-docs/dev/… pour savoir comment sélectionner par position à l'aide d'iloc / iat.
Wouter Overmeire
1
Le lien ci-dessus est obsolète car les documents d'indexation ont depuis été restructurés: pandas.pydata.org/pandas-docs/stable/… . À ce jour, dans laquelle la version la plus récente est la 0.21.0, ilocreste l'approche documentée pour accéder à une colonne par position.
iff_or
21

Vous pouvez utiliser des libellés en utilisant .loc ou des index en utilisant la méthode .iloc pour effectuer le découpage des colonnes, y compris les plages de colonnes:

In [50]: import pandas as pd

In [51]: import numpy as np

In [52]: df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))

In [53]: df
Out[53]: 
          a         b         c         d
0  0.806811  0.187630  0.978159  0.317261
1  0.738792  0.862661  0.580592  0.010177
2  0.224633  0.342579  0.214512  0.375147
3  0.875262  0.151867  0.071244  0.893735

In [54]: df.loc[:, ["a", "b", "d"]] ### Selective columns based slicing
Out[54]: 
          a         b         d
0  0.806811  0.187630  0.317261
1  0.738792  0.862661  0.010177
2  0.224633  0.342579  0.375147
3  0.875262  0.151867  0.893735

In [55]: df.loc[:, "a":"c"] ### Selective label based column ranges slicing
Out[55]: 
          a         b         c
0  0.806811  0.187630  0.978159
1  0.738792  0.862661  0.580592
2  0.224633  0.342579  0.214512
3  0.875262  0.151867  0.071244

In [56]: df.iloc[:, 0:3] ### Selective index based column ranges slicing
Out[56]: 
          a         b         c
0  0.806811  0.187630  0.978159
1  0.738792  0.862661  0.580592
2  0.224633  0.342579  0.214512
3  0.875262  0.151867  0.071244
Surya
la source
6

Vous pouvez accéder à plusieurs colonnes en transmettant une liste d'index de colonne à dataFrame.ix.

Par exemple:

>>> df = pandas.DataFrame({
             'a': np.random.rand(5),
             'b': np.random.rand(5),
             'c': np.random.rand(5),
             'd': np.random.rand(5)
         })

>>> df
          a         b         c         d
0  0.705718  0.414073  0.007040  0.889579
1  0.198005  0.520747  0.827818  0.366271
2  0.974552  0.667484  0.056246  0.524306
3  0.512126  0.775926  0.837896  0.955200
4  0.793203  0.686405  0.401596  0.544421

>>> df.ix[:,[1,3]]
          b         d
0  0.414073  0.889579
1  0.520747  0.366271
2  0.667484  0.524306
3  0.775926  0.955200
4  0.686405  0.544421
Safwan
la source
1

La méthode .transpose () convertit les colonnes en lignes et les lignes en colonnes, vous pouvez donc même écrire

df.transpose().ix[3]
Stefano Fedele
la source
2
La transposition peut perturber les types de données.
IanS