Comment obtenir la première colonne d'un pandas DataFrame en série?

143

J'ai essayé:

x=pandas.DataFrame(...)
s = x.take([0], axis=1)

Et sobtient un DataFrame, pas une série.

Yariv
la source

Réponses:

142
>>> import pandas as pd
>>> df = pd.DataFrame({'x' : [1, 2, 3, 4], 'y' : [4, 5, 6, 7]})
>>> df
   x  y
0  1  4
1  2  5
2  3  6
3  4  7
>>> s = df.ix[:,0]
>>> type(s)
<class 'pandas.core.series.Series'>
>>>

==================================================== ==========================

METTRE À JOUR

Si vous lisez ceci après juin 2017, il ixest obsolète dans pandas 0.20.2, alors ne l'utilisez pas. Utilisez locou à la ilocplace. Voir les commentaires et autres réponses à cette question.

herrfz
la source
4
df.set_index('x').y
herrfz
4
Cela vaudrait la peine d'ajouter l'alternative .iloc (comme proposé par Jeff plus bas sur cette page), car elle n'est pas ambiguë en présence de colonnes avec des nombres pour les noms.
sapo_cosmico
4
La réponse a été donnée en 2013; autant que je me souvienne, .ilocn'était pas encore là à l'époque. En 2016, la bonne réponse est celle de Jeff (après tout, il est pandasDieu, remarquez ;-)). Je ne sais pas quelle est la politique de SO concernant la mise à jour des réponses en raison du changement d'API; Je suis honnêtement surpris par le nombre de votes pour cette réponse, je ne pense pas que cela soit utile pour les gens ...
herrfz
2
Autre remarque: ixest obsolète dans la version 0.20.
ayhan
5
ixne doit pas être utilisé plus, utilisez ilocplutôt: s = df.ix[:,0]. Voir cet article pour une comparaison de ilocet ix.
normanius
117

À partir de la version 0.11 +, ... utilisez df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Jeff
la source
3
C'est la version la plus compatible avec les nouvelles versions et aussi avec les anciennes. Et probablement le plus efficace puisque l'équipe de développement promeut officiellement cette approche.
gaborous
116

Vous pouvez obtenir la première colonne sous forme de série en suivant le code:

x[x.columns[0]]
HYRY
la source
comment puis-je obtenir la dernière colonne comme ça?
Polly
Les autres fonctionnent bien aussi, mais celui-ci semble plus intuitif.
elPastor
6
Ce n'est pas bon si vous avez plusieurs colonnes avec le même nom. La question de savoir si les noms de colonne doivent être uniques ou non est une discussion distincte.
Vishal
@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471
13

N'est-ce pas la manière la plus simple?

Par nom de colonne:

In [20]: df = pd.DataFrame({'x' : [1, 2, 3, 4], 'y' : [4, 5, 6, 7]})
In [21]: df
Out[21]:
    x   y
0   1   4
1   2   5
2   3   6
3   4   7

In [23]: df.x
Out[23]:
0    1
1    2
2    3
3    4
Name: x, dtype: int64

In [24]: type(df.x)
Out[24]:
pandas.core.series.Series
SamJ
la source
9
Dans ce cas particulier, vous connaissez le nom de la première colonne ("x"), mais ce que signifiait la question était: "Comment puis-je accéder à la première colonne, quel que soit son nom". De plus, accéder à des colonnes comme celle-ci ( df.x) n'est pas générique - que se passe-t-il si le nom de la colonne contient des espaces? Que faire si le nom de la colonne coïncide avec le nom de l' DataFrameattribut -s? Il est plus général d'accéder aux colonnes en utilisant __getitem__(c'est-à-dire comme ceci:) df["x"].
ponadto
2
Ne fonctionne pas non plus si l'en-tête de la colonne contient par exemple des espaces.
Jean-François Corbett
3

Cela fonctionne très bien lorsque vous souhaitez charger une série à partir d'un fichier csv

x = pd.read_csv('x.csv', index_col=False, names=['x'],header=None).iloc[:,0]
print(type(x))
print(x.head(10))


<class 'pandas.core.series.Series'>
0    110.96
1    119.40
2    135.89
3    152.32
4    192.91
5    177.20
6    181.16
7    177.30
8    200.13
9    235.41
Name: x, dtype: float64
Christopher Pfeifer
la source
0
df[df.columns[i]]

iest la position / numéro de la colonne (à partir de 0 ).

Donc, i = 0c'est pour la première colonne.

Vous pouvez également obtenir la dernière colonne en utilisant i = -1

Ayan Kumar Saha
la source