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.

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.


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

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]]

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.