Selección de una fila de series / marco de datos de pandas por índice entero

395

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?

cs95
fuente
44
df.ix[2]no funciona - al menos no enpandas version '0.19.2'
Zahra
99
Para ver la diferencia entre la selección de fila y columna a través del operador de indexación [], consulte esta respuesta a continuación . También NUNCA UTILICE .ix, está en desuso
Ted Petrou

Respuestas:

552

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, .ilocque solo admiten la indexación de enteros y .locque solo admiten 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

[] solo corta las filas (por ubicación de etiqueta)

Jeff
fuente
77
¿Qué pasa si quieres la segunda y tercera y cuarta fila?
FaCoffee
1
simplemente puede pasar una lista de indexadores; los documentos se señalan arriba
Jeff
2
¿Alguien tiene una justificación para estos nombres? Encuentro esto difícil de recordar porque no estoy seguro de por qué ilocson las filas y las locetiquetas.
kilojulios
3
@kilojoules .ilocbusca las cosas por su orden en el índice (por ejemplo .iloc[[2]]) es la segunda "fila" en df. Esa fila está en la ubicación del índice4 . .loclos busca por su valor de índice. ¿Entonces tal vez "iloc" es como "i" como en A[i]? :)
Jim K.
1
@Jeff: esto funciona muy bien, pero ¿qué sucede cuando desea duplicar una fila de su marco de datos, como df.loc[-1] = df.iloc[[0]]e insertar eso? El marco viene con una columna de índice agregada que da error ValueError: cannot set a row with mismatched columns (consulte stackoverflow.com/questions/47340571/… )
Growler
63

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 entero 2. Esta columna no existe y KeyErrorse 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.

df[2:3]

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.

df[6:20:3]

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.

Ted Petrou
fuente
Intentando agregar filas a otro marco de datos usando el operador indxeing pero el otro marco de datos permanece vacío. ¿Por qué?
FindOutIslamNow
23

Puede pensar en DataFrame como un dict de Series. df[key]intente seleccionar el índice de columna por keyy 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

HYRY
fuente
gracias por la pista. Es curioso, este tipo de cosas es lo que todavía hace que los pandas cuestionen a veces. Agregar excepciones al comportamiento en ciertas situaciones ... para mí, es como sacrificar la consistencia por un poco de conveniencia.
Carl Berger
15

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

np_df = df.as_matrix()

y entonces

np_df[i] 

trabajaría.

Pavel Prochazka
fuente
11
que derrota todo el propósito de los índices de marcos de datos y todo lo demás que ofrecen los pandas
Fábio Dias
6

Puedes echar un vistazo al código fuente .

DataFrametiene una función privada _slice()para cortar DataFramey permite que el parámetro axisdetermine qué eje cortar. El __getitem__()for DataFrameno 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:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
waitingkuo
fuente
5

puede recorrer el marco de datos de esta manera.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
usuario1401491
fuente