Dies scheint eine lächerlich einfache Frage zu sein ... aber ich sehe nicht die einfache Antwort, die ich erwartet hatte.
Wie erhalte ich den Wert in einer n-ten Zeile einer bestimmten Spalte in Pandas? (Ich interessiere mich besonders für die erste Reihe, würde mich aber auch für eine allgemeinere Praxis interessieren).
Angenommen, ich möchte den Wert 1.2 in Btime als Variable abrufen.
Was ist der richtige Weg, um dies zu tun?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
würde funktionieren, ist die allgemeinere Form zu verwenden,iloc
wie von unutbu beantwortet1.2
? oder die Serie der Länge 1, mit der Sie erhaltendf_test.head(1)
, die auch den Index enthält? Um nur den Wert zu erhalten, tun Siedf_test.head(1).item()
odertolist()
schneiden Sie dann.Antworten:
Verwenden Sie zum Auswählen der
ith
Zeile :iloc
Um den i-ten Wert in der
Btime
Spalte auszuwählen, können Sie Folgendes verwenden:Es gibt einen Unterschied zwischen
df_test['Btime'].iloc[0]
(empfohlen) unddf_test.iloc[0]['Btime']
:DataFrames speichern Daten in spaltenbasierten Blöcken (wobei jeder Block einen einzelnen dtype hat). Wenn Sie zuerst nach Spalte auswählen, kann eine Ansicht zurückgegeben werden (was schneller ist als das Zurückgeben einer Kopie), und der ursprüngliche D-Typ bleibt erhalten. Wenn Sie dagegen zuerst nach Zeilen auswählen und der DataFrame Spalten mit unterschiedlichen D-Typen enthält, kopiert Pandas die Daten in eine neue Reihe von Objekt-D-Typen. Das Auswählen von Spalten ist also etwas schneller als das Auswählen von Zeilen. Obwohl es
df_test.iloc[0]['Btime']
funktioniert,df_test['Btime'].iloc[0]
ist es ein bisschen effizienter.Es gibt einen großen Unterschied zwischen den beiden, wenn es um die Zuordnung geht.
df_test['Btime'].iloc[0] = x
beeinflusstdf_test
,df_test.iloc[0]['Btime']
kann aber nicht. Im Folgenden finden Sie eine Erklärung, warum. Da ein geringfügiger Unterschied in der Reihenfolge der Indizierung einen großen Unterschied im Verhalten bewirkt, ist es besser, eine einzelne Indizierungszuweisung zu verwenden:df.iloc[0, df.columns.get_loc('Btime')] = x
(empfohlen):Die empfohlene Methode zum Zuweisen neuer Werte zu einem DataFrame besteht darin, eine verkettete Indizierung zu vermeiden und stattdessen die von andrew gezeigte Methode zu verwenden .
oder
Die letztere Methode ist etwas schneller, da
df.loc
die Zeilen- und Spaltenbeschriftungen in Positionsindizes konvertiert werden müssen, sodass bei Verwendungdf.iloc
stattdessen etwas weniger Konvertierung erforderlich ist .df['Btime'].iloc[0] = x
funktioniert, wird aber nicht empfohlen:Obwohl dies funktioniert, nutzt es die Art und Weise, wie DataFrames derzeit implementiert sind. Es gibt keine Garantie dafür, dass Pandas in Zukunft so arbeiten müssen. Insbesondere wird die Tatsache ausgenutzt, dass (derzeit)
df['Btime']
immer eine Ansicht (keine Kopie) zurückgegeben wird, sodass ein neuer Wert an der n-ten Stelle der Spalte von zugewiesen werdendf['Btime'].iloc[n] = x
kann .Btime
df
Da Pandas keine expliziten Garantien dafür gibt, wann Indexer eine Ansicht gegenüber einer Kopie zurückgeben, wird bei Zuweisungen, die eine verkettete Indizierung verwenden, im Allgemeinen immer ein Wert ausgelöst
SettingWithCopyWarning
, obwohl in diesem Fall die Zuweisung erfolgreich geändert werden kanndf
:df.iloc[0]['Btime'] = x
funktioniert nicht:Im Gegensatz dazu
df.iloc[0]['bar'] = 123
funktioniert die Zuweisung mit nicht, dadf.iloc[0]
eine Kopie zurückgegeben wird:Warnung : Ich hatte zuvor vorgeschlagen
df_test.ix[i, 'Btime']
. Es wird jedoch nicht garantiert, dass Sie denith
Wert erhalten, daix
versucht wird, nach Label zu indizieren, bevor versucht wird, nach Position zu indizieren . Wenn der DataFrame also einen ganzzahligen Index hat, der nicht in sortierter Reihenfolge ab 0 beginnt, gibt usingix[i]
die Zeile mit der Bezeichnung zurücki
und nicht dieith
Zeile zurück. Beispielsweise,quelle
df_test.iloc[0]['Btime']
funktioniert,df_test.iloc['Btime'][0]
ist es ein bisschen effizienter.df['Btime'].iloc[0]
bevorzugtdf['Btime'].values[0]
? Aus der Dokumentation geht hervor , dass "Warnung: Wir empfehlen die Verwendung von Series.array oder Series.to_numpy (), je nachdem, ob Sie einen Verweis auf die zugrunde liegenden Daten oder ein NumPy-Array benötigen." aber ich bin mir nicht sicher, was das genau bedeutetBeachten Sie, dass die Antwort von @unutbu korrekt ist, bis Sie den Wert auf etwas Neues setzen möchten. Dies funktioniert dann nicht, wenn Ihr Datenrahmen eine Ansicht ist.
Ein weiterer Ansatz, der sowohl beim Einstellen als auch beim Abrufen konsistent funktioniert, ist:
quelle
Ein anderer Weg, dies zu tun:
Dieser Weg scheint schneller zu sein als
.iloc
:quelle
df.iloc[0].head(1)
- Erster Datensatz nur aus der gesamten ersten Zeile.df.iloc[0]
- Ganze erste Zeile in Spalte.quelle
In einer allgemeinen Weise, wenn Sie die ersten abholen wollen N Zeilen aus der J - Säule aus
pandas dataframe
dem besten Weg , dies zu tun ist:quelle
Um zB den Wert aus Spalte 'Test' und Zeile 1 zu erhalten, funktioniert es wie folgt
da
df[['test']].values[0]
gibt nur ein Array zurückquelle
Eine andere Möglichkeit, die erste Zeile abzurufen und den Index beizubehalten:
quelle