operaciones de los pandas pitones en columnas

Hola, me gustaría saber la mejor forma de realizar operaciones en columnas en python utilizando pandas.

Tengo una base de datos clásica que he cargado como un dataframe, y a menudo tengo que hacer operaciones como para cada fila, si el valor en la columna etiquetada ‘A’ es mayor que x, entonces reemplace este valor por la columna ‘C’ menos columna ‘ RE’

por ahora hago 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 existe una forma más sencilla de realizar este tipo de operaciones y, lo que es más importante, la más efectiva, ya que tengo grandes bases de datos.

Lo había intentado sin el bucle for i, como en R o Stata, se me recomendó usar “a.any” o “a.all”, pero no encontré nada aquí ni en los documentos de los pandas.

Gracias de antemano.

Simplemente puede usar una máscara booleana con los .loc o .ix del dataframe.

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

Si tienes muchas cosas ramificadas, entonces puedes 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 debe ser generalmente mucho más rápido que un bucle for.

Más simple según yo.

 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.

 abc 2 11 -0.576309 2 11 -0.578449 2 11 -1.085822 2 11 9.000000 2 11 9.000000 2 11 -1.081405 

Hay muchas maneras de hacerlo, pero aquí está el patrón que me resulta 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'] 

Configurar los elementos menos que x es tan fácil como df.loc [~ idx, ‘A’] = 0

Empezar con..

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

terminar con…

 df.ix[df.A < 1,df.A = df['c'] - df['d']]; df abc 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