Wenn ich in Pandas eine Bezeichnung auswähle, die nur einen Eintrag im Index enthält, erhalte ich eine Serie zurück. Wenn ich jedoch einen Eintrag auswähle, der mehr als einen Eintrag enthält, erhalte ich einen Datenrahmen zurück.
Warum ist das so? Gibt es eine Möglichkeit, um sicherzustellen, dass ich immer einen Datenrahmen zurückerhalte?
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])
In [3]: type(df.loc[3])
Out[3]: pandas.core.frame.DataFrame
In [4]: type(df.loc[1])
Out[4]: pandas.core.series.Series
KeyError
wenn ich es versuche.loc[[nonexistent_label]]
..loc
ist viel langsamer als ohne. Immer noch lesbar, aber auch viel schneller, besser nutzendf.loc[1:1]
Sie haben einen Index mit drei Indexelementen
3
. Aus diesem Grunddf.loc[3]
wird ein Datenrahmen zurückgegeben.Der Grund ist, dass Sie die Spalte nicht angeben. So
df.loc[3]
wählt drei Elemente aller Spalten (die Spalte0
), währenddf.loc[3,0]
eine Reihe zurück. ZB gibtdf.loc[1:2]
auch einen Datenrahmen zurück, da Sie die Zeilen in Scheiben schneiden.Wenn Sie eine einzelne Zeile (as
df.loc[1]
) auswählen, wird eine Serie mit den Spaltennamen als Index zurückgegeben.Wenn Sie sicher sein möchten, immer einen DataFrame zu haben, können Sie wie schneiden
df.loc[1:1]
. Eine andere Option ist die boolesche Indizierung (df.loc[df.index==1]
) oder die Methode take (df.take([0])
aber diese verwendete Position ist keine Bezeichnung!).quelle
Der TLDR
Beim Benutzen
loc
df.loc[:]
= Datenrahmendf.loc[int]
= Datenrahmen, wenn Sie mehr als eine Spalte haben, und Serie, wenn Sie nur 1 Spalte im Datenrahmen habendf.loc[:, ["col_name"]]
= Datenrahmendf.loc[:, "col_name"]
= SerieNicht verwenden
loc
df["col_name"]
= Seriedf[["col_name"]]
= Datenrahmenquelle
Verwenden Sie
df['columnName']
diesedf[['columnName']]
Option , um eine Serie und einen Datenrahmen abzurufen.quelle
Sie haben in einem Kommentar zu Joris 'Antwort geschrieben:
Eine einzelne Zeile wird nicht in eine Serie konvertiert .
Es IST eine Serie aus :
No, I don't think so, in fact; see the edit
Das Datenmodell von Pandas-Objekten wurde so ausgewählt. Der Grund liegt sicherlich in der Tatsache, dass es einige Vorteile bietet, die ich nicht kenne (ich verstehe den letzten Satz des Zitats nicht vollständig, vielleicht ist es der Grund)
.
Edit: Ich stimme mir nicht zu
Ein Datenrahmen kann nicht aus Elementen zusammengesetzt werden, würde seine Serie, da der folgende Code die gleichen Typen „Serie“ auch für eine Reihe wie für eine Spalte gibt:
Ergebnis
Es macht also keinen Sinn vorzutäuschen, dass ein DataFrame aus Serien besteht, denn wie würden diese Serien aussehen: Spalten oder Zeilen? Dumme Frage und Vision.
.
Was ist dann ein DataFrame?
In der vorherigen Version dieser Antwort habe ich diese Frage gestellt und versucht, die Antwort auf den
Why is that?
Teil der Frage des OP und die ähnliche Befragungsingle rows to get converted into a series - why not a data frame with one row?
in einem seiner Kommentare zu finden,während der
Is there a way to ensure I always get back a data frame?
Teil von Dan Allan beantwortet wurde.Dann, da die oben zitierten Dokumente der Pandas besagen, dass die Datenstrukturen der Pandas am besten als Container mit niedrigdimensionalen Daten angesehen werden können, schien es mir, dass das Verständnis des Warum in den Merkmalen der Natur von DataFrame-Strukturen zu finden wäre.
Mir wurde jedoch klar, dass dieser zitierte Rat nicht als genaue Beschreibung der Art der Datenstrukturen von Pandas verstanden werden darf.
Dieser Rat bedeutet nicht, dass ein DataFrame ein Container der Serie ist.
Es drückt aus, dass die mentale Darstellung eines DataFrames als Container von Serien (entweder Zeilen oder Spalten gemäß der Option, die zu einem bestimmten Zeitpunkt einer Überlegung in Betracht gezogen wird) eine gute Möglichkeit ist, DataFrames zu berücksichtigen, auch wenn dies in der Realität nicht unbedingt der Fall ist. "Gut" bedeutet, dass diese Vision es ermöglicht, DataFrames effizient zu nutzen. Das ist alles.
.
Was ist dann ein DataFrame-Objekt?
Die DataFrame- Klasse erzeugt Instanzen mit einer bestimmten Struktur, die aus der NDFrame- Basisklasse stammt und selbst von der PandasContainer- Basisklasse abgeleitet ist, die auch eine übergeordnete Klasse der Series- Klasse ist.
Beachten Sie, dass dies für Pandas bis Version 0.12 korrekt ist. In der kommenden Version 0.13 wird Series auch nur von der NDFrame- Klasse abgeleitet.
Ergebnis
Nach meinem Verständnis verfügt eine DataFrame-Instanz nun über bestimmte Methoden, mit denen gesteuert werden kann, wie Daten aus Zeilen und Spalten extrahiert werden.
Die Funktionsweise dieser Extraktionsmethoden wird auf dieser Seite beschrieben: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
Wir finden darin die von Dan Allan und anderen Methoden angegebene Methode.
Warum wurden diese Extraktionsmethoden so hergestellt, wie sie waren?
Das liegt sicherlich daran, dass sie als diejenigen bewertet wurden, die bessere Möglichkeiten und eine einfachere Datenanalyse bieten.
Genau das drückt sich in diesem Satz aus:
Das Warum der Extraktion von Daten aus einer DataFRame-Instanz liegt nicht in ihrer Struktur, sondern im Warum dieser Struktur. Ich denke, dass die Struktur und Funktionsweise der Datenstruktur der Pandas gemeißelt wurden, um so intellektuell intuitiv wie möglich zu sein, und dass man den Blog von Wes McKinney lesen muss, um die Details zu verstehen.
quelle
Wenn das Ziel darin besteht, eine Teilmenge des Datensatzes mithilfe des Index abzurufen, ist es am besten, die Verwendung von
loc
oder zu vermeideniloc
. Stattdessen sollten Sie eine ähnliche Syntax verwenden:quelle
Wenn Sie auch im Index des Datenrahmens auswählen, kann das Ergebnis entweder ein Datenrahmen oder eine Serie oder eine Serie oder ein Skalar (Einzelwert) sein.
Diese Funktion stellt sicher, dass Sie immer eine Liste aus Ihrer Auswahl erhalten (wenn df, Index und Spalte gültig sind):
quelle