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.

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.


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

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

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.