Jak zdobyć pierwszą kolumnę pandy DataFrame jako serię?

142

Próbowałem:

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

I spobiera DataFrame, a nie Series.

Yariv
źródło

Odpowiedzi:

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

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

AKTUALIZACJA

Jeśli czytasz to po czerwcu 2017 r., ixZostało wycofane w pandach 0.20.2, więc nie używaj go. Użyj loclub iloczamiast. Zobacz komentarze i inne odpowiedzi na to pytanie.

herrfz
źródło
4
df.set_index('x').y
herrfz
4
Warto byłoby dodać alternatywę .iloc (zgodnie z propozycją Jeffa w dalszej części tej strony), ponieważ nie jest ona niejednoznaczna w obecności kolumn z numerami nazw.
sapo_cosmico
4
Odpowiedź została udzielona w 2013 roku; o ile pamiętam, .ilocwtedy jeszcze nie było. W 2016 roku prawidłowa odpowiedź brzmi: Jeff (w końcu jest pandasBogiem ;-)). Nie jestem pewien, jakie są zasady SO dotyczące aktualizacji odpowiedzi w związku ze zmianą API; Jestem szczerze zaskoczony przez liczbę głosów oddanych na tę odpowiedź, nie sądzę, że było to użyteczne dla ludzi ...
herrfz
2
Kolejna uwaga: ixzostała wycofana w wersji 0.20.
ayhan
5
ixNie należy stosować więcej, użyj iloczamiast: s = df.ix[:,0]. Zobacz ten post, aby zobaczyć porównanie iloci ix.
normanius
117

Od v0.11 +, ... użyj df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Jeff
źródło
3
Jest to najbardziej kompatybilna wersja z nowymi wydaniami, a także ze starymi. I prawdopodobnie najbardziej efektywny, ponieważ zespół programistów oficjalnie promuje to podejście.
hałaśliwy
116

Możesz pobrać pierwszą kolumnę jako serię, korzystając z następującego kodu:

x[x.columns[0]]
HYRY
źródło
jak mogę dostać ostatnią taką kolumnę?
Polly,
Inne również działają dobrze, ale ten wydaje się bardziej intuicyjny.
elPastor
6
Nie jest to dobre, jeśli masz wiele kolumn o tej samej nazwie. To, czy nazwy kolumn powinny być unikalne, czy nie, to osobna dyskusja.
Vishal
@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471
13

Czy to nie jest najprostszy sposób?

Według nazwy kolumny:

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
źródło
9
W tym konkretnym przypadku znasz nazwę pierwszej kolumny („x”), ale pytanie oznaczało: „Jak mogę uzyskać dostęp do pierwszej kolumny, NIEZALEŻNIE od jej nazwy”. Również dostęp do kolumn takich jak ta ( df.x) nie jest ogólny - a co, jeśli nazwa kolumny zawiera spacje? Co się stanie, jeśli nazwa kolumny pokrywa się z DataFramenazwą atrybutu -s? Bardziej ogólne jest uzyskiwanie dostępu do kolumn za pomocą __getitem__(tj. Tak df["x"]:).
ponadto
2
Nie działa również, jeśli nagłówek kolumny zawiera np. Spacje.
Jean-François Corbett
3

Działa to świetnie, gdy chcesz załadować serię z pliku 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
źródło
0
df[df.columns[i]]

gdzie ijest pozycją / numerem kolumny (zaczynając od 0 ).

Tak i = 0jest w pierwszej kolumnie.

Możesz również pobrać ostatnią kolumnę za pomocą i = -1

Ayan Kumar Saha
źródło