python seleccionar - Seleccionando una fila de pandas series / dataframe por índice entero




columna agregar (6)

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.

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?


Puedes recorrer el cuadro de datos de esta manera.

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

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 .


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)

Asignación de columna super simple

Un marco de datos de pandas se implementa como un dictado ordenado de columnas.

Esto significa que el __getitem__ [] no solo puede usarse para obtener una columna determinada, sino que __setitem__ [] = se puede usar para asignar una nueva columna.

Por ejemplo, este marco de datos puede tener una columna agregada simplemente usando el descriptor de acceso []

    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Tenga en cuenta que esto funciona incluso si el índice del marco de datos está desactivado.

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[] = es el camino a seguir, pero ¡cuidado!

Sin embargo, si tiene un pd.Series y trata de asignarlo a un marco de datos donde los índices están desactivados, se encontrará con problemas. Ver ejemplo:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Esto se debe a que pd.Series de forma predeterminada tiene un índice enumerado de 0 a n. Y el método de pandas [] = trata de ser "inteligente"

Lo que realmente está sucediendo.

Cuando utiliza el método [] = , los pandas realizan silenciosamente una combinación externa o combinación externa utilizando el índice del marco de datos de la mano izquierda y el índice de la serie de la mano derecha. df['column'] = series

Nota al margen

Esto causa rápidamente disonancia cognitiva, ya que el método []= está tratando de hacer muchas cosas diferentes dependiendo de la entrada, y el resultado no se puede predecir a menos que sepa cómo funcionan los pandas. Por lo tanto, recomendaría contra []= en las bases de código, pero al explorar datos en un cuaderno, está bien.

Atendiendo el problema

Si tiene una pd.Series y desea que se asigne de arriba a abajo, o si está codificando un código productivo y no está seguro del orden del índice, vale la pena salvaguardar este tipo de problemas.

Usted podría pd.Series el pd.Series a un np.ndarray o una list , esto hará el truco.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

o

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

Pero esto no es muy explícito.

Algún programador puede venir y decir "Hey, esto parece redundante, solo optimizaré esto".

Forma explícita

Establecer el índice de pd.Series para que sea el índice de la df es explícito.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

O más realista, es probable que ya tengas una serie de pd.Series disponible.

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

Ahora puede ser asignado

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

df.reset_index() alternativa con df.reset_index()

Dado que la disonancia del índice es el problema, si siente que el índice del marco de datos no debe dictar las cosas, simplemente puede eliminar el índice, esto debería ser más rápido, pero no está muy limpio, ya que su función ahora probablemente hace dos cosas.

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Nota sobre df.assign

Si bien df.assign hace que sea más explícito lo que está haciendo, en realidad tiene los mismos problemas que el anterior []=

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Solo df.assign cuidado con df.assign que su columna no se llama self . Causará errores. Esto hace que df.assign mal , ya que hay este tipo de artefactos en la función.

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

Puedes decir: "Bueno, entonces no me self ". Pero quién sabe cómo esta función cambia en el futuro para admitir nuevos argumentos. Tal vez el nombre de su columna sea un argumento en una nueva actualización de pandas, causando problemas con la actualización.





python pandas dataframe indexing