Tengo curiosidad por saber por qué df[2]
no es compatible, mientras que df.ix[2]
y df[2:3]
ambos funcionan.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Esperaría df[2]
trabajar de la misma manera df[2:3]
para ser coherente con la convención de indexación de Python. ¿Hay alguna razón de diseño para no admitir la fila de indexación por entero único?
df.ix[2]
no funciona - al menos no enpandas version '0.19.2'
[]
, consulte esta respuesta a continuación . También NUNCA UTILICE.ix
, está en desusoRespuestas:
haciéndose eco de @HYRY, vea los nuevos documentos en 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Aquí tenemos nuevos operadores,
.iloc
que solo admiten la indexación de enteros y.loc
que solo admiten la indexación de etiquetaspor ejemplo, imagina este escenario
[]
solo corta las filas (por ubicación de etiqueta)fuente
iloc
son las filas y lasloc
etiquetas..iloc
busca las cosas por su orden en el índice (por ejemplo.iloc[[2]]
) es la segunda "fila" endf
. Esa fila está en la ubicación del índice4
..loc
los busca por su valor de índice. ¿Entonces tal vez "iloc" es como "i" como enA[i]
? :)df.loc[-1] = df.iloc[[0]]
e insertar eso? El marco viene con una columna de índice agregada que da errorValueError: cannot set a row with mismatched columns
(consulte stackoverflow.com/questions/47340571/… )El propósito principal del operador de indexación de DataFrame
[]
es seleccionar columnas.Cuando el operador de indexación pasa una cadena o un entero, intenta encontrar una columna con ese nombre en particular y devolverla como una Serie.
Entonces, en la pregunta anterior:
df[2]
busca un nombre de columna que coincida con el valor entero2
. Esta columna no existe yKeyError
se genera a.El operador de indexación de DataFrame cambia completamente el comportamiento para seleccionar filas cuando se usa la notación de corte
Curiosamente, cuando se le da un segmento, el operador de indexación de DataFrame selecciona filas y puede hacerlo por ubicación entera o por etiqueta de índice.
Esto se dividirá comenzando desde la fila con la ubicación de enteros 2 hasta 3, excluyendo el último elemento. Entonces, solo una fila. A continuación, se seleccionan las filas que comienzan en la ubicación de enteros 6 hasta 20, pero no se incluyen 20 por cada tercera fila.
También puede usar sectores que consisten en etiquetas de cadena si su índice DataFrame tiene cadenas. Para más detalles, vea esta solución en .iloc vs .loc .
Casi nunca uso esta notación de corte con el operador de indexación, ya que no es explícito y casi nunca se usa. Al cortar en hileras, quédese con
.loc/.iloc
.fuente
Puede pensar en DataFrame como un dict de Series.
df[key]
intente seleccionar el índice de columna porkey
y devuelva un objeto Serie.Sin embargo, cortar dentro de [] corta las filas, porque es una operación muy común.
Puede leer el documento para más detalles:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
fuente
Para el acceso basado en índices a la tabla pandas, también se puede considerar la opción numpy.as_array para convertir la tabla a la matriz Numpy como
y entonces
trabajaría.
fuente
Puedes echar un vistazo al código fuente .
DataFrame
tiene una función privada_slice()
para cortarDataFrame
y permite que el parámetroaxis
determine qué eje cortar. El__getitem__()
forDataFrame
no establece el eje al invocar_slice()
. Entonces el_slice()
corte es por defecto el eje 0.Puedes realizar un experimento simple que podría ayudarte:
fuente
puede recorrer el marco de datos de esta manera.
fuente