Como obter a primeira coluna de um DataFrame do pandas como uma série?

142

Eu tentei:

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

E sobtém um DataFrame, não uma Série.

Yariv
fonte

Respostas:

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

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

ATUALIZAR

Se você está lendo isso depois de junho de 2017, ixfoi preterido nos pandas 0.20.2, portanto, não o use. Use locou em ilocvez disso. Veja comentários e outras respostas a esta pergunta.

herrfz
fonte
4
df.set_index('x').y
herrfz
4
Vale a pena adicionar a alternativa .iloc (como proposto por Jeff mais abaixo nesta página), pois não é ambíguo na presença de colunas com números para nomes.
Sapo_cosmico 16/04
4
A resposta foi dada em 2013; pelo que me lembro, .ilocainda não existia naquela época. Em 2016, a resposta correta é de Jeff (afinal ele é pandasDeus, lembre-se ;-)). Não sei qual é a política da SO em relação à atualização de respostas devido a alterações na API; Sinceramente estou surpreso com o número de votos para esta resposta, não acho que foi tão útil para as pessoas ...
herrfz
2
Outra observação: ixfoi descontinuado na versão 0.20.
ayhan
5
ixnão deve mais ser usado, use ilocem vez disso: s = df.ix[:,0]. Veja este post para uma comparação de iloce ix.
Normanius #
117

A partir da v0.11 +, ... use df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Jeff
fonte
3
Esta é a versão mais compatível com os novos lançamentos e também com os antigos. E provavelmente o mais eficiente, pois a equipe de desenvolvimento está promovendo oficialmente essa abordagem.
gaborous
116

Você pode obter a primeira coluna como uma série seguindo o código:

x[x.columns[0]]
HYRY
fonte
como posso obter a última coluna assim?
22416 Polly
Os outros também funcionam bem, mas este parece mais intuitivo.
ElPastor
6
Isso não é bom se você tiver várias colunas com o mesmo nome. Se os nomes das colunas devem ser exclusivos ou não é uma discussão separada.
Vishal 10/10
@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471
13

Não é este o caminho mais simples?

Por nome da coluna:

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
fonte
9
Nesse caso em particular, você sabe o nome da primeira coluna ("x"), mas o que a pergunta significava era: "Como posso acessar a primeira coluna, independentemente do nome". Além disso, acessar colunas como esta ( df.x) não é genérico - e se o nome da coluna contiver espaços? E se o nome da coluna coincidir com o DataFramenome do atributo -s? É mais geral acessar colunas usando __getitem__(ou seja, assim:) df["x"].
Ponadto 10/03
2
Também não funciona se o cabeçalho da coluna tiver, por exemplo, espaços nela.
Jean-François Corbett
3

Isso funciona muito bem quando você deseja carregar uma série de um arquivo 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
fonte
0
df[df.columns[i]]

onde ié a posição / número da coluna (começando em 0 ).

Então, i = 0é para a primeira coluna.

Você também pode obter a última coluna usando i = -1

Ayan Kumar Saha
fonte