Puede alguien explicar cómo estos tres métodos de corte son diferentes?

He visto el docs,
y he visto estos respuestas, pero aún me encuentro incapaz de explicar cómo los tres son diferentes. A mí, que parecen intercambiables, en gran parte, porque están en los niveles más bajos de rebanar.

Por ejemplo, digamos que queremos obtener las cinco primeras filas de un DataFrame. ¿Cómo es que todos los tres de estos trabajos?

df.loc[:5]
df.ix[:5]
df.iloc[:5]

Alguien puede presentar tres casos en los que la distinción en los usos son más claras?

InformationsquelleAutor AZhao | 2015-07-23

3 Comentarios

  1. 803

    Nota: en los pandas versión 0.20.0 y, encima, ix es obsoleto y el uso de loc y iloc se anima en su lugar. He dejado las piezas de esta respuesta que describa ix intacta como una referencia para los usuarios de versiones anteriores de los pandas. Los ejemplos se han añadido debajo de mostrar alternativas a ix.


    Primero, aquí está un resumen de los tres métodos:

    • loc obtiene filas (o columnas), con especial etiquetas del índice.
    • iloc obtiene filas (o columnas) en particular posiciones en el índice (de modo que sólo se toma enteros).
    • ix generalmente se trata de comportarse como loc pero vuelve a comportarse como iloc si una etiqueta no está presente en el índice.

    Es importante tener en cuenta algunas sutilezas que pueden hacer ix un poco difícil de usar:

    • si el índice es de tipo entero, ix sólo se hará uso de etiquetas basado en la indexación y no caer de nuevo en la posición basado en la indexación. Si la etiqueta no está en el índice, se produce un error.

    • si el índice no contiene sólo enteros, entonces dado un número entero, ix inmediatamente el uso de la posición de indización basada en lugar de etiquetas basado en la indexación. Sin embargo, si ix se da otro tipo (por ejemplo, una cadena), se pueden utilizar etiquetas basado en la indexación.


    Para ilustrar las diferencias entre los tres métodos, considere la siguiente Serie:

    >>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
    >>> s
    49   NaN
    48   NaN
    47   NaN
    46   NaN
    45   NaN
    1    NaN
    2    NaN
    3    NaN
    4    NaN
    5    NaN

    Veremos rebanar con el valor entero 3.

    En este caso, s.iloc[:3] nos devuelve las 3 primeras filas (ya que se trata de 3 como una posición) y s.loc[:3] nos devuelve las primeras 8 filas (ya que se trata de 3 como una etiqueta):

    >>> s.iloc[:3] # slice the first three rows
    49   NaN
    48   NaN
    47   NaN
    
    >>> s.loc[:3] # slice up to and including label 3
    49   NaN
    48   NaN
    47   NaN
    46   NaN
    45   NaN
    1    NaN
    2    NaN
    3    NaN
    
    >>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc
    49   NaN
    48   NaN
    47   NaN
    46   NaN
    45   NaN
    1    NaN
    2    NaN
    3    NaN

    Aviso s.ix[:3] devuelve de la misma Serie de s.loc[:3] ya que se busca la etiqueta en lugar de trabajar en la posición (y el índice de s es de tipo entero).

    Lo que si tratamos con un número entero de la etiqueta que no está en el índice (es decir 6)?

    Aquí s.iloc[:6] devuelve los primeros 6 filas de la Serie como se esperaba. Sin embargo, s.loc[:6] plantea una KeyError desde 6 no está en el índice.

    >>> s.iloc[:6]
    49   NaN
    48   NaN
    47   NaN
    46   NaN
    45   NaN
    1    NaN
    
    >>> s.loc[:6]
    KeyError: 6
    
    >>> s.ix[:6]
    KeyError: 6

    Como por las sutilezas se señaló anteriormente, s.ix[:6] ahora plantea una KeyError porque se trata de trabajar como loc pero no puede encontrar un 6 en el índice. Debido a que nuestro índice es de tipo entero ix no caer de nuevo a comportarse como iloc.

    Si, sin embargo, nuestro índice fue de tipo mixto, dado un entero ix que se comporten como iloc inmediatamente en lugar de criar a un KeyError:

    >>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
    >>> s2.index.is_mixed() # index is mix of different types
    True
    >>> s2.ix[:6] # now behaves like iloc given integer
    a   NaN
    b   NaN
    c   NaN
    d   NaN
    e   NaN
    1   NaN

    Tenga en cuenta que ix todavía pueden aceptar la no-enteros y se comportan como loc:

    >>> s2.ix[:'c'] # behaves like loc given non-integer
    a   NaN
    b   NaN
    c   NaN

    Como consejo general, si usted es sólo la indización mediante el uso de etiquetas, o sólo la indización mediante integer posiciones de palo, con loc o iloc para evitar resultados inesperados – trate de no usar ix.


    La combinación de posición y basadas en la etiqueta de indización basada

    A veces se administra un DataFrame, usted querrá mezcla de la etiqueta y de posición de la indexación de los métodos de las filas y de columnas.

    Por ejemplo, considere la siguiente DataFrame. Cómo cortar las filas, hasta e incluyendo la ‘c’ y tomar las primeras cuatro columnas?

    >>> df = pd.DataFrame(np.nan, 
                          index=list('abcde'),
                          columns=['x','y','z', 8, 9])
    >>> df
        x   y   z   8   9
    a NaN NaN NaN NaN NaN
    b NaN NaN NaN NaN NaN
    c NaN NaN NaN NaN NaN
    d NaN NaN NaN NaN NaN
    e NaN NaN NaN NaN NaN

    En las versiones anteriores de los pandas (antes de 0.20.0) ix le permite hacer esto con bastante perfectamente – podemos cortar las filas de la etiqueta y las columnas por la posición (tenga en cuenta que para las columnas, ix se predeterminado basado en la posición, rebanar desde 4 no es un nombre de columna):

    >>> df.ix[:'c', :4]
        x   y   z   8
    a NaN NaN NaN NaN
    b NaN NaN NaN NaN
    c NaN NaN NaN NaN

    En las versiones posteriores de los pandas, podemos lograr este resultado usando iloc y con la ayuda de otro método:

    >>> df.iloc[:df.index.get_loc('c') + 1, :4]
        x   y   z   8
    a NaN NaN NaN NaN
    b NaN NaN NaN NaN
    c NaN NaN NaN NaN

    get_loc() es un método de índice de significado «obtener la posición de la etiqueta en este índice». Tenga en cuenta que desde rebanar con iloc es exclusivo de su extremo, debemos agregar 1 a este valor si queremos fila ‘c’ así.

    Hay más ejemplos en los pandas’ documentación aquí.

    • Gran explicación! Una relacionada con la pregunta que siempre he tenido es ¿qué relación, si alguna, loc, iloc y ix tienen con SettingWithCopy advertencias? Hay algo de documentación, pero para ser honesto, todavía estoy un poco confundido pandas.pydata.org/pandas-docs/stable/…
    • y ix todavía podría desencadenar la advertencia de que si ellos están encadenados entre sí. Utilizando el ejemplo DataFrame en el vinculado docs dfmi.loc[:, 'one'].loc[:, 'second'] activa la advertencia como dfmi['one']['second'] porque una copia de los datos (en lugar de una vista) podría ser devuelto por la primera operación de indización.
    • Qué utilizar si se desea buscar un DateIndex con una Fecha, o algo así df.ix[date, 'Cash']?
    • ambos loc o ix debe trabajar en ese caso. Por ejemplo, df.loc['2016-04-29', 'Cash'] devolverá todas las filas de los índices con que la fecha concreta de la ‘Efectivo’ en la columna. (Usted puede ser tan específico como te gusta cuando la recuperación de los índices con las cadenas, por ejemplo, '2016-01' seleccionar todas las datetimes caer en enero de 2016, `2016-01-02 11′ seleccionará datetimes el 2 de enero de 2016 con el tiempo 11:??:??.)
    • En caso de querer actualizar esta respuesta en algún punto, hay sugerencias para cómo utilizar loc/iloc en lugar de la ix github.com/pandas-dev/pandas/issues/14218
    • Gracias! Agradable y clara explicación! Una sugerencia: tal vez tenga sentido para mover todo lo relacionado con ix a una sección separada de la respuesta, si es obsoleto ahora?
    • Estoy realmente triste que obsoleto ix. Por lo general, yo sé cómo mis dataframe se ve, y la escritura my_dataframe_name.get_loc() y, a continuación, recordando que tengo que compensar por 1 siente increíblemente difícil de manejar en comparación con el R de la sintaxis…
    • ¿Cómo sería la sintaxis de la mirada como cuando las etiquetas están en las columnas? Sólo el intercambio de información de filas y columnas dentro de los corchetes no parecen solucionar eso?

  2. 114

    iloc obras basadas en entero de posicionamiento. Así que no importa lo que sus etiquetas de fila son, siempre se puede, por ejemplo, obtener la primera fila haciendo

    df.iloc[0]

    o los últimos cinco filas haciendo

    df.iloc[-5:]

    También se puede utilizar en las columnas. Este recupera la 3ª columna:

    df.iloc[:, 2]    # the : in the first position indicates all rows

    Puede combinarlos para obtener las intersecciones de filas y columnas:

    df.iloc[:3, :3] # The upper-left 3 X 3 entries (assuming df has 3+ rows and columns)

    Por otro lado, .loc uso denomina índices. Vamos a establecer un marco de datos con cadenas como rótulos de fila y columna:

    df = pd.DataFrame(index=['a', 'b', 'c'], columns=['time', 'date', 'name'])

    Entonces podemos obtener la primera fila por

    df.loc['a']     # equivalent to df.iloc[0]

    y el segundo dos filas de la 'date' columna por

    df.loc['b':, 'date']   # equivalent to df.iloc[1:, 1]

    y así sucesivamente. Ahora, es probablemente vale la pena señalar que el valor predeterminado de fila y columna de los índices para un DataFrame son enteros entre 0 y en este caso iloc y loc funcionará de la misma manera. Esta es la razón por la que sus tres ejemplos son equivalentes. Si usted tenía un no-índice numérico, tales como cadenas o datetimes, df.loc[:5] podría generar un error.

    También, usted puede hacer la columna de recuperación sólo por el uso de los datos del marco de __getitem__:

    df['time']    # equivalent to df.loc[:, 'time']

    Ahora suponga que desea posición de mezcla y el nombre de la indexación, es decir, la indexación de uso de los nombres de las filas y las posiciones en las columnas (para aclarar, me refiero a seleccionar de nuestro marco de datos, en lugar de crear un marco de datos con cadenas en el índice de fila y de los números enteros en la columna de índice). Aquí es donde .ix viene en:

    df.ix[:2, 'time']    # the first two rows of the 'time' column

    Creo que también vale la pena mencionar que puede pasar booleano vectores a la loc método así. Por ejemplo:

     b = [True, False, True]
     df.loc[b] 

    Volverá el 1 y el 3 filas de df. Esto es equivalente a df[b] para la selección, pero también puede ser utilizado para la asignación a través de vectores booleanos:

    df.loc[b, 'name'] = 'Mary', 'John'
    • Es df.iloc[:, :] equivalente a todas las filas y columnas?
    • Es, como sería df.loc[:, :]. Puede ser utilizado para volver a asignar los valores de toda la DataFrame o crear una vista de ella.
  3. 92

    En mi opinión, la aceptó respuesta es confuso, ya que utiliza un DataFrame sólo con los valores que faltan. Yo también no me gusta el término posición basada en para .iloc y, en su lugar, prefieren entero ubicación, ya que es mucho más descriptivo y exactamente lo que .iloc representa. La palabra clave es de tipo ENTERO .iloc necesidades de los números ENTEROS.

    Ver a mi muy detallada blog de la serie en el subconjunto de selección para obtener más


    .ix está en desuso y ambiguo, y nunca debe ser usado

    Porque .ix está en desuso vamos sólo se centran en las diferencias entre .loc y .iloc.

    Antes de hablar de las diferencias, es importante entender que DataFrames tienen etiquetas que ayudan a identificar cada columna y cada índice. Echemos un vistazo a una muestra de DataFrame:

    df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
                       'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
                       'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
                       'height':[165, 70, 120, 80, 180, 172, 150],
                       'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
                       'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
                       },
                      index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])

    ¿Cómo se iloc, ix y loc diferentes?

    Todas las palabras en negrita son las etiquetas. Las etiquetas, age, color, food, height, score y state se utilizan para la columnas. Las demás etiquetas, Jane, Nick, Aaron, Penelope, Dean, Christina, Cornelia se utilizan para la índice.


    Las principales formas para seleccionar filas en particular en un DataFrame son con el .loc y .iloc indizadores. Cada uno de estos indizadores también puede utilizarse simultáneamente para seleccionar columnas, pero es más fácil centrarse en las filas de ahora. También, cada uno de los indexadores el uso de un conjunto de soportes que siga inmediatamente a su nombre para hacer sus selecciones.

    .loc selecciona datos sólo a través de las etiquetas

    Vamos a hablar primero acerca de la .loc indexador que sólo selecciona los datos por el índice o etiquetas de columna. En nuestra muestra DataFrame, nos han proporcionado nombres significativos como los valores para el índice. Muchos DataFrames no tendrá ningún nombres significativos y, por el contrario, de forma predeterminada sólo los enteros de 0 a n-1, donde n es la longitud de la DataFrame.

    Hay tres entradas diferentes que usted puede usar para .loc

    • Una cadena
    • Una lista de cadenas
    • Rebanada de notación el uso de cadenas como el inicio y la parada de valores

    La selección de una sola fila con .loc con una cadena

    Para seleccionar una sola fila de datos, coloque el índice de la etiqueta en el interior de los soportes siguientes .loc.

    df.loc['Penelope']

    Esta devuelve la fila de datos como una Serie

    age           4
    color     white
    food      Apple
    height       80
    score       3.3
    state        AL
    Name: Penelope, dtype: object

    Selección de varias filas .loc con una lista de cadenas

    df.loc[['Cornelia', 'Jane', 'Dean']]

    Este devuelve un DataFrame con las filas en el orden especificado en la lista:

    ¿Cómo se iloc, ix y loc diferentes?

    Selección de varias filas .loc con la notación de segmentos

    Rebanada de notación se define por una start, stop y valores de paso. Cuando rebanado por la etiqueta, pandas, incluye el valor de stop en la vuelta. El siguiente rodajas de Aaron Dean, inclusive. Su tamaño del paso no está explícitamente definido, pero de pago a 1.

    df.loc['Aaron':'Dean']

    ¿Cómo se iloc, ix y loc diferentes?

    Complejo rebanadas se pueden tomar de la misma manera como las listas de Python.

    .iloc selecciona datos sólo por entero ubicación

    Vamos ahora a .iloc. Cada fila y columna de datos en un DataFrame tiene un número entero ubicación en la que la define. Esto es en adición a la etiqueta que se muestra visualmente en la salida. El entero ubicación es simplemente el número de filas/columnas en la parte superior izquierda comenzando en 0.

    Hay tres entradas diferentes que usted puede usar para .iloc

    • Un entero
    • Una lista de enteros
    • La notación de segmentos usando números enteros como el inicio y la parada de valores

    La selección de una sola fila con .iloc con un número entero

    df.iloc[4]

    Esta devuelve la 5ª fila (entero ubicación 4) como una Serie

    age           32
    color       gray
    food      Cheese
    height       180
    score        1.8
    state         AK
    Name: Dean, dtype: object

    Selección de varias filas .iloc con una lista de enteros

    df.iloc[[2, -2]]

    Este devuelve un DataFrame de la tercera y la segunda a la última fila:

    ¿Cómo se iloc, ix y loc diferentes?

    Selección de varias filas .iloc con la notación de segmentos

    df.iloc[:5:3]

    ¿Cómo se iloc, ix y loc diferentes?


    Simultánea de selección de filas y columnas .loc y .iloc

    Una excelente capacidad de ambos .loc/.iloc es su capacidad para seleccionar filas y columnas de forma simultánea. En los ejemplos anteriores, todas las columnas fueron devueltos de cada selección. Podemos elegir columnas con el mismo tipo de entradas como hacemos para las filas. Simplemente necesitamos para separar la fila y la columna de selección con un coma.

    Por ejemplo, podemos seleccionar las filas Jane, y el Decano con sólo las columnas de altura, la puntuación y el estado como este:

    df.loc[['Jane', 'Dean'], 'height':]

    ¿Cómo se iloc, ix y loc diferentes?

    Este utiliza una lista de las etiquetas de las filas y una rebanada de notación para las columnas

    Nosotros, naturalmente, puede realizar operaciones similares con .iloc usando sólo números enteros.

    df.iloc[[1,4], 2]
    Nick      Lamb
    Dean    Cheese
    Name: food, dtype: object

    Selección simultánea con las etiquetas y entero ubicación

    .ix fue usado para hacer selecciones simultáneamente con las etiquetas y entero ubicación que era útil, pero confuso y ambiguo, a veces y por suerte se ha quedado obsoleta. En el caso de que usted necesita para hacer una selección con una mezcla de etiquetas y entero de los lugares, usted tendrá que hacer tanto sus selecciones etiquetas o entero lugares.

    Por ejemplo, si queremos seleccionar filas Nick y Cornelia junto con las columnas 2 y 4, se podría utilizar .loc por la conversión de los números enteros a las etiquetas con las siguientes:

    col_names = df.columns[[2, 4]]
    df.loc[['Nick', 'Cornelia'], col_names] 

    O, alternativamente, convertir el índice de etiquetas para enteros con el get_loc método de índice.

    labels = ['Nick', 'Cornelia']
    index_ints = [df.index.get_loc(label) for label in labels]
    df.iloc[index_ints, [2, 4]]

    Booleano De Selección

    El .loc indizador puede también hacer booleano de selección. Por ejemplo, si estamos interesados en encontrar todas las filas donde la edad es superior a 30 y devolver sólo el food y score columnas podemos hacer lo siguiente:

    df.loc[df['age'] > 30, ['food', 'score']] 

    Puede replicar esta con .iloc pero no puede pasar un valor booleano de la serie. Debe convertir el booleano de la Serie en una colección de la matriz como esta:

    df.iloc[(df['age'] > 30).values, [2, 4]] 

    La selección de todas las filas

    Es posible utilizar .loc/.iloc para sólo selección de columna. Puede seleccionar todas las filas mediante un colon como este:

    df.loc[:, 'color':'score':2]

    ¿Cómo se iloc, ix y loc diferentes?


    La indexación de operador, [], puede seleccionar las filas y columnas también, pero no simultáneamente.

    La mayoría de las personas están familiarizadas con el propósito principal de la DataFrame la indexación de operador, que es para seleccionar las columnas. Una cadena selecciona una sola columna como una Serie y una lista de cadenas selecciona varias columnas como un DataFrame.

    df['food']
    
    Jane          Steak
    Nick           Lamb
    Aaron         Mango
    Penelope      Apple
    Dean         Cheese
    Christina     Melon
    Cornelia      Beans
    Name: food, dtype: object

    El uso de una lista selecciona varias columnas

    df[['food', 'score']]

    ¿Cómo se iloc, ix y loc diferentes?

    Lo que las personas están menos familiarizados con, es que, cuando rebanada se utiliza la notación, a continuación, la selección pasa por etiquetas de fila o por entero ubicación. Esto es muy confuso y algo que casi nunca los uso pero funciona.

    df['Penelope':'Christina'] # slice rows by label

    ¿Cómo se iloc, ix y loc diferentes?

    df[2:6:2] # slice rows by integer location

    ¿Cómo se iloc, ix y loc diferentes?

    La claridad de .loc/.iloc para la selección de filas es muy preferido. La indexación de operador solo es incapaz de seleccionar las filas y columnas de forma simultánea.

    df[3:5, 'color']
    TypeError: unhashable type: 'slice'
    • Wow, este fue uno de los muy bien articulada y lúcido de las explicaciones que he llegado a través de una programación tema, Lo que se explica en el pasado acerca de la normal de indexación que funciona tanto en filas o por columnas es una de las razones que nos han loc y iloc método. Me encontré con esa salvedad en el datacamp curso. un.) ¿Qué hacer en el df.las columnas y en el df.el índice de retorno? Es una lista de cadenas? Si es una lista, es que permite el acceso de los dos elementos df.las columnas de[ [2,4] ] en una lista? b.) Puedo llamar get_loc() en el df.las columnas? c.) ¿Por qué tenemos que llamar df[‘edad’]>30.los valores en caso de iloc.

Dejar respuesta

Please enter your comment!
Please enter your name here