Wie bekomme ich die erste Spalte eines Pandas DataFrame als Serie?

142

Ich habe es versucht:

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

Und sbekommt einen DataFrame, keine Serie.

Yariv
quelle

Antworten:

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

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

AKTUALISIEREN

Wenn Sie dies nach Juni 2017 lesen, ixist es in Pandas 0.20.2 veraltet, verwenden Sie es also nicht. Verwenden Sie locoder ilocstattdessen. Siehe Kommentare und andere Antworten auf diese Frage.

herrfz
quelle
4
df.set_index('x').y
Herrfz
4
Es lohnt sich, die .iloc-Alternative hinzuzufügen (wie von Jeff weiter unten auf dieser Seite vorgeschlagen), da sie bei Vorhandensein von Spalten mit Nummern für Namen nicht mehrdeutig ist.
sapo_cosmico
4
Die Antwort wurde 2013 gegeben; Soweit ich mich erinnere, .ilocwar ich damals noch nicht da. 2016 ist die richtige Antwort Jeffs (schließlich ist er pandasGott, wohlgemerkt ;-)). Ich bin mir nicht sicher, wie SO bei der Aktualisierung von Antworten aufgrund von API-Änderungen vorgeht. Ich bin ehrlich überrascht von der Anzahl der Stimmen für diese Antwort, dachte nicht, dass es für die Leute so nützlich war ...
herrfz
2
Noch ein Hinweis: ixwar in Version 0.20 veraltet .
Ayhan
5
ixsollte nicht mehr verwendet werden, verwenden Sie ilocstattdessen : s = df.ix[:,0]. In diesem Beitrag finden Sie einen Vergleich von ilocund ix.
Normanius
115

Sie können die erste Spalte als Serie erhalten, indem Sie den folgenden Code verwenden:

x[x.columns[0]]
HYRY
quelle
Wie kann ich die letzte Spalte so bekommen?
Polly
Die anderen funktionieren auch gut, aber dieser scheint intuitiver zu sein.
elPastor
6
Dies ist nicht gut, wenn Sie mehrere Spalten mit demselben Namen haben. Ob Spaltennamen eindeutig sein sollen oder nicht, ist eine separate Diskussion.
Vishal
@Pollyx[x.columns[x.columns.size-1]]
fujianjin6471
115

Ab v0.11 +, ... verwenden df.iloc.

In [7]: df.iloc[:,0]
Out[7]: 
0    1
1    2
2    3
3    4
Name: x, dtype: int64
Jeff
quelle
3
Dies ist die kompatibelste Version mit den neuen Versionen und auch mit den alten. Und wahrscheinlich das effizienteste, da das Entwicklerteam diesen Ansatz offiziell fördert.
gaborous
13

Ist das nicht der einfachste Weg?

Nach Spaltenname:

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
quelle
9
In diesem speziellen Fall kennen Sie den Namen der ersten Spalte ("x"), aber die Frage lautete: "Wie kann ich auf die erste Spalte zugreifen, unabhängig vom Namen?" Außerdem ist der Zugriff auf Spalten wie diese ( df.x) nicht generisch - was ist, wenn der Spaltenname Leerzeichen enthält? Was ist, wenn der Name der Spalte mit dem DataFrameAttributnamen -s übereinstimmt ? Es ist allgemeiner, mit __getitem__(z. B. :) auf Spalten zuzugreifen df["x"].
Ponadto
2
Funktioniert auch nicht, wenn der Header der Spalte zB Leerzeichen enthält.
Jean-François Corbett
3

Dies funktioniert hervorragend, wenn Sie eine Serie aus einer CSV-Datei laden möchten

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
quelle
0
df[df.columns[i]]

Wo iist die Position / Nummer der Spalte (ab 0 ).

Also, i = 0ist für die erste Spalte.

Sie können die letzte Spalte auch mit abrufen i = -1

Ayan Kumar Saha
quelle