Verwenden Sie zum Auswählen der ith
Zeile :iloc
In [31]: df_test.iloc[0]
Out[31]:
ATime 1.2
X 2.0
Y 15.0
Z 2.0
Btime 1.2
C 12.0
D 25.0
E 12.0
Name: 0, dtype: float64
Um den i-ten Wert in der Btime
Spalte auszuwählen, können Sie Folgendes verwenden:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
Es gibt einen Unterschied zwischen df_test['Btime'].iloc[0]
(empfohlen) und df_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
beeinflusst df_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
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 .
df.loc[df.index[n], 'Btime'] = x
oder
df.iloc[n, df.columns.get_loc('Btime')] = x
Die letztere Methode ist etwas schneller, da df.loc
die Zeilen- und Spaltenbeschriftungen in Positionsindizes konvertiert werden müssen, sodass bei Verwendung df.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 kann df
:
In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
In [26]: df
Out[26]:
foo bar
0 A 99 <-- assignment succeeded
2 B 100
1 C 100
df.iloc[0]['Btime'] = x
funktioniert nicht:
Im Gegensatz dazu df.iloc[0]['bar'] = 123
funktioniert die Zuweisung mit nicht, da df.iloc[0]
eine Kopie zurückgegeben wird:
In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [67]: df
Out[67]:
foo bar
0 A 99 <-- assignment failed
2 B 100
1 C 100
Warnung : Ich hatte zuvor vorgeschlagen df_test.ix[i, 'Btime']
. Es wird jedoch nicht garantiert, dass Sie den ith
Wert erhalten, da ix
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 using ix[i]
die Zeile mit der Bezeichnung zurück i
und nicht die ith
Zeile zurück. Beispielsweise,
In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [2]: df
Out[2]:
foo
0 A
2 B
1 C
In [4]: df.ix[1, 'foo']
Out[4]: 'C'
df_test.head(1)
würde funktionieren, ist die allgemeinere Form zu verwenden,iloc
wie von unutbu beantwortet