Seleccionar una fila de series pandas / dataframe por índice entero


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 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 de filas por entero único?

Author: coldspeed, 2013-04-19

6 answers

Haciendo eco a @HYRY, ver los nuevos documentos en 0.11

Http://pandas.pydata.org/pandas-docs/stable/indexing.html

Aquí tenemos nuevos operadores, .iloc para soportar explícitamente solo la indexación de enteros, y .loc para soportar explícitamente solo la indexación de etiquetas

Por ejemplo, imagine 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

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

 378
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 12:40:37

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 levanta un KeyError.


El operador de indexación de DataFrame cambia completamente el comportamiento para seleccionar filas cuando se utiliza la notación de corte

Extrañamente, 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 cortará a partir de la fila con la ubicación entera 2 hasta 3, excluyendo el último elemento. Por lo tanto, sólo una sola fila. Lo siguiente selecciona filas que comienzan en la ubicación del entero 6 hasta, pero no incluyendo 20 por cada tercera fila.

df[6:20:3]

También puede usar slices consistentes en etiquetas de cadena si su El índice DataFrame tiene cadenas. Para más detalles, vea esta solución activada.iloc vs .loc .

Casi nunca uso esta notación de corte con el operador de indexación, ya que no es explícita y casi nunca se usa. Al cortar por filas, pegue con .loc/.iloc.

 24
Author: Ted Petrou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 19:41:40

Puedes pensar DataFrame como un dictado de Series. df[key] intente seleccionar el índice de la columna por key y devuelve un objeto de serie.

Sin embargo, rebanar dentro de [] rebana 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

 19
Author: HYRY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 07:33:32

Para el acceso basado en índices a la tabla pandas, también se puede considerar numpy.as_array opción para convertir la tabla a matriz Numpy como

np_df = df.as_matrix()

Y luego

np_df[i] 

Funcionaría.

 10
Author: Pavel Prochazka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 06:53:06

Puede recorrer el marco de datos de esta manera .

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
 5
Author: user1401491,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 10:56:04

Puedes echar un vistazo al código fuente .

DataFrame tiene una función privada _slice() para cortar el DataFrame, y permite que el parámetro axis determine qué eje cortar. El __getitem__() para DataFrame no establece el eje mientras invoca _slice(). Así que el _slice() lo corta por defecto en el eje 0.

Usted puede tomar un experimento simple, que podría ayudarle:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
 4
Author: waitingkuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 10:47:25