Estoy tratando de llenar ninguno de los valores de un Pandas dataframe con 0 por sólo un subconjunto de las columnas.

Cuando hago:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

La salida:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Se reemplaza cada None con 0‘s. Lo que quiero hacer es, sólo reemplazar Nones en las columnas a y b, pero no c.

¿Cuál es la mejor manera de hacer esto?

InformationsquelleAutor Sait | 2016-06-30

6 Comentarios

  1. 153

    Puede seleccionar el deseado y columnas de hacerlo por medio de la asignación:

    df[['a', 'b']] = df[['a','b']].fillna(value=0)

    El resultado es el esperado:

         a    b    c
    0  1.0  4.0  NaN
    1  2.0  5.0  NaN
    2  3.0  0.0  7.0
    3  0.0  6.0  8.0
    • Sí, esto es exactamente lo que yo quiero! Gracias. Alguna forma de hacerlo directamente? Mi original dataframe es bastante grande.
    • Creo que no hay ninguna ganancia en el rendimiento al hacer esto en su lugar, como está sobrescribiendo el orig df de todos modos
    • El loc es superfluo aquí, df[['a', 'b']] = df[['a','b']].fillna(value=0) funcionará
    • No es producir un temporal en el marco de datos y por lo tanto necesita más memoria para hacerlo? (Yo estoy más preocupado acerca de la memoria de tiempo de complejidad.)
    • pero usted tiene que producir una temp df en algún punto en el proceso en caso de que borks forma parte a través de así que realmente no hay diferencia de rendimiento entre la asignación de nuevo a ti mismo y el uso de inplace=True
    • Para muchas operaciones, inplace todavía va a trabajar en una copia. No sé si es el caso para fillna o no. Consulte esta respuesta de uno de los pandas los desarrolladores del núcleo.
    • Gracias, me he quitado la loc. He condicionado a mí mismo para siempre uso loc sólo para jugar a lo seguro!
    • No hay problema. De hecho, estuve pensando lo mismo que antes eran hoy en día en lo que respecta a inplace, y de paso para encontrar el enlace. Eso es una agradable coincidencia!

  2. 55

    Puede usar dict , fillna con valor diferente para diferentes columna

    df.fillna({'a':0,'b':0})
    Out[829]: 
         a    b    c
    0  1.0  4.0  NaN
    1  2.0  5.0  NaN
    2  3.0  0.0  7.0
    3  0.0  6.0  8.0

    Después de asignar de nuevo

    df=df.fillna({'a':0,'b':0})
    df
    Out[831]: 
         a    b    c
    0  1.0  4.0  NaN
    1  2.0  5.0  NaN
    2  3.0  0.0  7.0
    3  0.0  6.0  8.0
    • realmente genial, por Cierto, para que el diccionario puede utilizar fromkeys si quieres, +1
    • La respuesta/ejemplo sería más claro si en realidad mostraron valores diferentes para las distintas columnas.
    • eso es cierto , pero aún así tratar de coincidir con el op de la salida que se espera
  3. 12

    Puede evitar hacer una copia del objeto mediante Wen de la solución y directamente=True:

    df.fillna({'a':0, 'b':0}, inplace=True)
    print(df)

    Que los rendimientos:

         a    b    c
    0  1.0  4.0  NaN
    1  2.0  5.0  NaN
    2  3.0  0.0  7.0
    3  0.0  6.0  8.0
  4. 3

    He aquí cómo usted puede hacerlo todo en una sola línea:

    df[['a', 'b']].fillna(value=0, inplace=True)

    Desglose: df[['a', 'b']] selecciona las columnas que desea rellenar los valores NaN para, value=0 le dice a llenar Nan con cero, y inplace=True va a hacer permanentes los cambios, sin tener que hacer una copia del objeto.

  5. 3

    el uso de la respuesta produce una advertencia acerca de hacer cambios en una copia de un df de la rebanada. Asumiendo que usted tiene otras columnas, una mejor manera de hacer esto es para pasar un diccionario:

    df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)

  6. 2

    O algo por el estilo:

    df.loc[df['a'].isnull(),'a']=0
    df.loc[df['b'].isnull(),'b']=0

    y si hay más:

    for i in your_list:
        df.loc[df[i].isnull(),i]=0

Dejar respuesta

Please enter your comment!
Please enter your name here