¿Cómo obtener la primera columna de un pandas DataFrame como una serie?


142

Lo intenté:

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

Y sobtiene un DataFrame, no una Serie.

Respuestas:


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

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

ACTUALIZAR

Si está leyendo esto después de junio de 2017, ixha quedado en desuso en pandas 0.20.2, así que no lo use. Uso loco en su iloclugar. Ver comentarios y otras respuestas a esta pregunta.


44
df.set_index('x').y
herrfz

44
Valdría la pena agregar la alternativa .iloc (como propuso Jeff más abajo en esta página), ya que no es ambigua en presencia de columnas con números para los nombres.
sapo_cosmico

44
La respuesta se dio en 2013; Por lo que recuerdo, .iloctodavía no estaba allí en ese entonces. En 2016, la respuesta correcta es la de Jeff (después de todo, es pandasDios, ten en cuenta ;-)). No estoy seguro de cuál es la política de SO con respecto a la actualización de respuestas debido al cambio de API; Estoy sinceramente sorprendido por la cantidad de votos para esta respuesta, no pensé que fuera tan útil para las personas ...
herrfz

2
Otra nota: ixquedó en desuso en la versión 0.20.
ayhan

55
ixNo debe utilizarse más, utilice ilocen su lugar: s = df.ix[:,0]. Vea esta publicación para una comparación de ilocy ix.
normanius

117

Desde v0.11 +, ... uso df.iloc.

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

3
Esta es la versión más compatible con los nuevos lanzamientos y también con los antiguos. Y probablemente el más eficiente ya que el equipo de desarrollo está promoviendo oficialmente este enfoque.
gaborous

116

Puede obtener la primera columna como Serie siguiendo el siguiente código:

x[x.columns[0]]

¿Cómo puedo obtener la última columna así?
Polly

Los otros también funcionan bien, pero este parece más intuitivo.
elPastor

66
Esto no es bueno si tiene varias columnas con el mismo nombre. Si los nombres de columna deben ser únicos o no es una discusión separada.
Vishal

@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471

13

¿No es esta la forma más simple?

Por nombre de columna:

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
En este caso en particular, conoce el nombre de la primera columna ("x"), pero lo que significaba la pregunta era: "¿Cómo puedo acceder a la primera columna, SIN IMPORTAR su nombre?". Además, acceder a columnas como esta ( df.x) no es genérico: ¿qué sucede si el nombre de la columna contiene espacios? ¿Qué sucede si el nombre de la columna coincide con el DataFramenombre del atributo -s? Es más general acceder a las columnas usando __getitem__(es decir, así:) df["x"].
ponadto

2
Tampoco funciona si el encabezado de la columna tiene, por ejemplo, espacios.
Jean-François Corbett

3

Esto funciona muy bien cuando desea cargar una serie desde un archivo 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]]

donde ies la posición / número de la columna (a partir de 0 ).

Entonces, i = 0es para la primera columna.

También puede obtener la última columna usando i = -1

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.