Esta parece una pregunta ridículamente fácil ... pero no veo la respuesta fácil que esperaba.
Entonces, ¿cómo obtengo el valor en una enésima fila de una columna dada en Pandas? (Estoy particularmente interesado en la primera fila, pero también estaría interesado en una práctica más general).
Por ejemplo, digamos que quiero extraer el valor 1.2 en Btime como variable.
¿Cuál es la forma correcta de hacer esto?
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)
funcionara, la forma más general es usariloc
como respondió unutbu1.2
? o la serie de longitud 1 con la que obtienesdf_test.head(1)
, que también contendrá el índice? Para obtener solo el valor hacerdf_test.head(1).item()
, otolist()
luego cortar.Respuestas:
Para seleccionar la
ith
fila, useiloc
:Para seleccionar el i-ésimo valor en la
Btime
columna que podría usar:Hay una diferencia entre
df_test['Btime'].iloc[0]
(recomendado) ydf_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
afectadf_test
, perodf_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
(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 ,
o
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 usadf.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 quedf['Btime'].iloc[n] = x
puede usarse para asignar un nuevo valor en la enésima ubicación de laBtime
columna dedf
.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 modificardf
:df.iloc[0]['Btime'] = x
No funciona:En contraste, la asignación con
df.iloc[0]['bar'] = 123
no funciona porquedf.iloc[0]
está devolviendo una copia:Advertencia : previamente había sugerido
df_test.ix[i, 'Btime']
. Pero esto no está garantizado para darle elith
valor ya queix
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 usarix[i]
devolverá la fila etiquetada eni
lugar de laith
fila. Por ejemplo,fuente
df_test.iloc[0]['Btime']
funciona,df_test.iloc['Btime'][0]
es un poco más eficiente.df['Btime'].iloc[0]
prefieredf['Btime'].values[0]
? Puedo ver en la documentación que dice "Advertencia: Recomendamos usar Series.array o Series.to_numpy (), dependiendo de si necesita una referencia a los datos subyacentes o una matriz NumPy". pero no estoy seguro exactamente qué significa esoTenga en cuenta que la respuesta de @unutbu será correcta hasta que desee establecer el valor en algo nuevo, entonces no funcionará si su marco de datos es una vista.
Otro enfoque que funcionará consistentemente con la configuración y la obtención es:
fuente
Otra forma de hacer esto:
Esta forma parece ser más rápida que usar
.iloc
:fuente
df.iloc[0].head(1)
- Primer conjunto de datos solo de toda la primera fila.df.iloc[0]
- Toda la primera fila en la columna.fuente
De manera general, si desea recoger las primeras N filas de la columna J de
pandas dataframe
la mejor manera de hacer esto es:fuente
Para obtener, por ejemplo, el valor de la columna 'prueba' y la fila 1, funciona como
ya que solo
df[['test']].values[0]
devuelve una matrizfuente
Otra forma de obtener la primera fila y preservar el índice:
fuente