Para seleccionar la ith
fila, useiloc
:
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
Para seleccionar el i-ésimo valor en la Btime
columna que podría usar:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
Hay una diferencia entre df_test['Btime'].iloc[0]
(recomendado) y df_test.iloc[0]['Btime']
:
Los marcos de datos almacenan datos en bloques basados en columnas (donde cada bloque tiene un solo tipo de letra). Si primero selecciona por columna, se puede devolver una vista (que es más rápida que devolver una copia) y se conserva el tipo de letra original. Por el contrario, si selecciona primero por fila y si el DataFrame tiene columnas de diferentes tipos, entonces Pandas copia los datos en una nueva Serie de tipos de objetos. Por lo tanto, seleccionar columnas es un poco más rápido que seleccionar filas. Por lo tanto, aunque
df_test.iloc[0]['Btime']
funciona, df_test['Btime'].iloc[0]
es un poco más eficiente.
Hay una gran diferencia entre los dos cuando se trata de asignación.
df_test['Btime'].iloc[0] = x
afecta df_test
, pero df_test.iloc[0]['Btime']
puede que no. Vea a continuación una explicación de por qué. Debido a que una diferencia sutil en el orden de indexación hace una gran diferencia en el comportamiento, es mejor usar una asignación de indexación única:
df.iloc[0, df.columns.get_loc('Btime')] = x
df.iloc[0, df.columns.get_loc('Btime')] = x
(recomendado):
La forma recomendada de asignar nuevos valores a un DataFrame es evitar la indexación encadenada y, en su lugar, usar el método mostrado por andrew ,
df.loc[df.index[n], 'Btime'] = x
o
df.iloc[n, df.columns.get_loc('Btime')] = x
El último método es un poco más rápido, ya que df.loc
tiene que convertir las etiquetas de fila y columna en índices posicionales, por lo que se necesita un poco menos de conversión si se usa df.iloc
en su
lugar.
df['Btime'].iloc[0] = x
funciona, pero no se recomienda:
Aunque esto funciona, está aprovechando la forma en que los marcos de datos se implementan actualmente . No hay garantía de que Pandas tenga que trabajar de esta manera en el futuro. En particular, está aprovechando el hecho de que (actualmente) df['Btime']
siempre devuelve una vista (no una copia), por lo que df['Btime'].iloc[n] = x
puede usarse para asignar un nuevo valor en la enésima ubicación de la Btime
columna de df
.
Dado que Pandas no ofrece garantías explícitas sobre cuándo los indexadores devuelven una vista frente a una copia, las asignaciones que utilizan indexación encadenada generalmente siempre generan una SettingWithCopyWarning
respuesta, aunque en este caso la asignación logra modificar 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
No funciona:
En contraste, la asignación con df.iloc[0]['bar'] = 123
no funciona porque df.iloc[0]
está devolviendo una copia:
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
Advertencia : previamente había sugerido df_test.ix[i, 'Btime']
. Pero esto no está garantizado para darle el ith
valor ya que ix
intenta indexar por etiqueta antes de intentar indexar por posición . Entonces, si el DataFrame tiene un índice entero que no está en orden ordenado a partir de 0, entonces usar ix[i]
devolverá la fila etiquetada en i
lugar de la ith
fila. Por ejemplo,
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)
funcionara, la forma más general es usariloc
como respondió unutbu