python - nueva - seleccionar una columna pandas




Seleccionando una fila de pandas series/dataframe por índice entero (4)

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


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





indexing