Um die i-te
Zeile auszuwählen, verwenden Sie 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önnten 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 ein einzelnes dtype hat). Wenn Sie zuerst nach Spalte auswählen, kann eine Ansicht zurückgegeben werden (was schneller als eine Kopie ist) und das ursprüngliche dtype bleibt erhalten. Im Gegensatz dazu kopiert Pandas die Daten in eine neue Series mit dem Objekt-Dtype, wenn Sie zuerst nach Zeile auswählen und der DataFrame Spalten mit unterschiedlichen Dtypes hat. Das Auswählen von Spalten ist daher ein wenig schneller als das Auswählen von Zeilen. Obwohl also df_test.iloc[0]['Btime']
funktioniert, ist df_test['Btime'].iloc[0]
ein wenig effizienter.
Es gibt einen großen Unterschied zwischen den beiden im Hinblick auf die Zuweisung. df_test['Btime'].iloc[0] = x
wirkt sich auf df_test
aus, aber df_test.iloc[0]['Btime']
möglicherweise nicht. Lesen Sie unten eine Erklärung, warum. Da ein subtiler Unterschied in der Reihenfolge der Indizierung einen großen Unterschied im Verhalten ausmacht, ist es besser, die Einzelindizierungs-Zuweisung 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 ist es, verkettete Indizierung zu vermeiden und stattdessen die Methode zu verwenden, die von andrew gezeigt wird,
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 Spaltenbezeichnungen in positionale Indizes umwandeln muss, daher ist etwas weniger Konvertierung erforderlich, wenn Sie stattdessen df.iloc
verwenden.
df['Btime'].iloc[0] = x
funktioniert, ist jedoch nicht empfohlen:
Obwohl dies funktioniert, nutzt es die Art und Weise, wie DataFrames derzeit implementiert sind. Es gibt keine Garantie dafür, dass Pandas dies in Zukunft auch so umsetzen muss. Insbesondere wird dies ausgenutzt, dass (derzeit) df['Btime']
immer eine Ansicht zurückgibt (keine Kopie), sodass df['Btime'].iloc[n] = x
verwendet werden kann, um einen neuen Wert an der nth-Stelle der Btime
-Spalte von df
zuzuweisen.
Da Pandas keine expliziten Garantien darüber macht, wann Indexer eine Ansicht anstelle einer Kopie zurückgeben, lösen Zuweisungen, die verkettete Indizierungen verwenden, im Allgemeinen immer eine SettingWithCopyWarning
aus, obwohl in diesem Fall die Zuweisung erfolgreich ist und df
modifiziert:
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 <-- Zuweisung erfolgreich
2 B 100
1 C 100
df.iloc[0]['Btime'] = x
funktioniert nicht:
Im Gegensatz dazu funktioniert eine Zuweisung mit df.iloc[0]['bar'] = 123
nicht, da df.iloc[0]
eine Kopie zurückgibt:
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 <-- Zuweisung fehlgeschlagen
2 B 100
1 C 100
Warnung: Ich hatte zuvor df_test.ix[i, 'Btime']
vorgeschlagen. Dies garantiert jedoch nicht, dass Sie den i-ten
Wert erhalten, da ix
zuerst nach dem Label und nicht nach der Position indiziert. Wenn der DataFrame also einen Ganzzahlindex hat, der nicht in geordneter Folge ab 0 sortiert ist, gibt die Verwendung von ix[i]
die Zeile mit dem Label i
zurück, anstelle der i-ten
Zeile. Zum Beispiel,
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'