python - seleccionar - Seleccionando una fila de pandas series/dataframe por índice entero
seleccionar columnas de un dataframe pandas (6)
El propósito principal del operador de indexación de DataFrame, []
es seleccionar columnas.
Cuando al operador de indexación se le 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 entero 2
. Esta columna no existe y se KeyError
un KeyError
.
El operador de indexación de DataFrame cambia completamente el comportamiento para seleccionar filas cuando se utiliza la notación de segmento
Extrañamente, cuando se le da una porción, el operador de indexación de DataFrame selecciona filas y puede hacerlo por ubicación de entero o por etiqueta de índice.
df[2:3]
Esto partirá desde la fila con la ubicación del entero 2 hasta 3, excluyendo el último elemento. Por lo tanto, sólo una sola fila. Lo siguiente selecciona las filas que comienzan en la ubicación del entero 6 hasta pero que no incluyen 20 por cada tercera fila.
df[6:20:3]
También puede usar segmentos 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 segmento con el operador de indexación, ya que no es explícito y casi nunca se usa. Cuando corte por filas, .loc/.iloc
con .loc/.iloc
.
Tengo curiosidad por saber por qué df[2]
no es compatible, mientras que df.ix[2]
y df[2:3]
funcionan ambos.
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
Espero que df[2]
funcione de la misma manera que df[2:3]
para ser consistente con la convención de indexación de Python. ¿Hay alguna razón de diseño para no admitir la indexación fila por entero entero?
Haciendo eco de @HYRY, vea los nuevos documentos en 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Aquí tenemos nuevos operadores, .iloc
para explícitamente admite solo la indexación de enteros, y .loc
para explícitamente solo para la indexación de etiquetas
por ejemplo, imagina este escenario
In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list(''AB''))
In [2]: df
Out[2]:
A B
0 1.068932 -0.794307
2 -0.470056 1.192211
4 -0.284561 0.756029
6 1.037563 -0.267820
8 -0.538478 -0.800654
In [5]: df.iloc[[2]]
Out[5]:
A B
4 -0.284561 0.756029
In [6]: df.loc[[2]]
Out[6]:
A B
2 -0.470056 1.192211
[]
corta las filas (por ubicación de etiqueta) solamente
Para el acceso basado en índices a la tabla de pandas, también se puede considerar la opción numpy.as_array para convertir la tabla en una matriz de Numpy como
np_df = df.as_matrix()
y entonces
np_df[i]
trabajaría.
Puedes echar un vistazo al código fuente .
DataFrame
tiene una función privada _slice()
para DataFrame
el DataFrame
, y permite que el axis
parámetros determine qué eje segmentar. El __getitem__()
para DataFrame
no establece el eje al invocar _slice()
. Así que el _slice()
corta por defecto en el eje 0.
Puedes tomar un experimento simple, que podría ayudarte:
print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
Puedes pensar en DataFrame como un dict de Series. df[key]
intente seleccionar el índice de columna por key
y devuelve un objeto Serie.
Sin embargo, cortar dentro de [] corta las filas, porque es una operación muy común.
Puedes leer el documento para más detalles:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
Puedes recorrer el cuadro de datos de esta manera.
for ad in range(1,dataframe_c.size):
print(dataframe_c.values[ad])