Hola me gustaría saber la mejor manera de hacer operaciones en las columnas en python usando los pandas.

Tengo un clásico de la base de datos que he cargado como un dataframe, y a menudo tengo que hacer operaciones como para cada fila, si el valor en la columna con la etiqueta ‘a’ es mayor que x, a continuación, reemplazar este valor en la columna C’ menos la columna ‘D’

por ahora tengo que hacer algo como

for i in len(df.index):
    if df.ix[i,'A'] > x :
        df.ix[i,'A'] = df.ix[i,'C'] - df.ix[i, 'D']

Me gustaría saber si hay una manera más sencilla de hacer este tipo de operaciones y, más importante, la más eficaz, como yo tienen grandes bases de datos

Había intentado sin el para que me de bucle, como en R o Stata, de lo que se recomienda el uso de «una.cualquier» o «un.todo», pero yo lo hice no encontrar nada, ya sea aquí o en el de los pandas docs.

Gracias por adelantado.

  • El código tiene un error: len(df.index) devuelve un número entero que no se puede afirmar. Sería correcto hacer for i in range(0, len(df.índice)) con el fin de recorrer el dataframe

4 Comentarios

  1. 6

    Sólo se puede utilizar un valor booleano de la máscara con la .loc o .ix atributos de la DataFrame.

    mask = df['A'] > 2
    df.ix[mask, 'A'] = df.ix[mask, 'C'] - df.ix[mask, 'D']

    Si usted tiene un montón de ramificación de las cosas, entonces usted puede hacer:

    def func(row):
        if row['A'] > 0:
            return row['B'] + row['C']
        elif row['B'] < 0:
            return row['D'] + row['A']
        else:
            return row['A']
    
    df['A'] = df.apply(func, axis=1)

    apply en general, debe ser mucho más rápido que un bucle for.

    • De hecho tengo varias condiciones : si df.[‘A’] == 999 ; si df[‘A’] < 999 y df[‘B’] == 999 y así sucesivamente… no estoy seguro de cómo este booleano se extiende
    • Este ejemplo se proporciona es la siguiente: (df['A'] == 999) & (df['B'] == 999), Pero si usted tiene una de las ramas con más instrucción también debe utilizar apply a lo largo de la tarjeta.
    • Actualizado el ejemplo.
    • Que realmente funciona para algunos de mis casos, gracias por eso ; pero en otras tengo que considerar la posibilidad real de valores diferentes, por ejemplo para las variables categóricas : fila[‘A’] == 1, A1, fila[‘A’] ==2, entonces A2, fila[‘A’] == 3, A3 y así sucesivamente.
    • He añadido un ejemplo de la respuesta que cubre ese caso (utilizando apply).
  2. 6

    más simple de acuerdo conmigo.

    from random import randint, randrange, uniform
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'a':randrange(0,10),'b':randrange(10,20),'c':np.random.randn(10)})
    
    #If colC > 0,5, then ColC = ColB - Cola 
    df['c'][df['c'] > 0.5] = df['b'] - df['a']

    Probado, funciona.

    a   b   c
    2  11 -0.576309
    2  11 -0.578449
    2  11 -1.085822
    2  11  9.000000
    2  11  9.000000
    2  11 -1.081405
    • funciona bien ! pero devuelve una advertencia en la primera ejecución: >>> df['c'][df['c'] > 0.5] = df['b'] - df['a'] __main__:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
  3. 0

    Hay un montón de maneras de hacer esto, pero aquí está el patrón me parece más fácil de leer.

    #Assume df is a Panda's dataframe object
    idx = df.loc[:, 'A'] > x
    df.loc[idx, 'A'] = df.loc[idx, 'C'] - df.loc[idx, 'D']

    Configuración de los elementos menos de x es tan fácil como df.loc[~idx, ‘A’] = 0

  4. 0

    Empezar con..

    df = pd.DataFrame({'a':randrange(1,10),'b':randrange(10,20),'c':np.random.randn(10)})
    a   b   c
    0   7   12  0.475248
    1   7   12  -1.090855
    2   7   12  -1.227489
    3   7   12  0.163929

    final con…

    df.ix[df.A < 1,df.A = df['c'] - df['d']]; df
        a   b   c
    0   7   12  5.000000
    1   7   12  5.000000
    2   7   12  5.000000
    3   7   12  5.000000
    4   7   12  1.813233
    • lo siento, pero esto lleva a un error de sintaxis : >>> df.ix[df.A < 1,df.A = df['c'] - df['d']]; df File "<stdin>", line 1 df.ix[df.A < 1,df.A = df['c'] - df['d']]; df ^ SyntaxError: invalid syntax

Dejar respuesta

Please enter your comment!
Please enter your name here