Aplicar función a algunas filas en pandas.
Quiero hacer varios cambios en algunas filas de un dataframe de pandas. Las filas a cambiar se seleccionan en función del contenido de otras columnas. El conjunto de datos es grande y no he logrado encontrar una solución que no sea muy lenta.
El siguiente código de ejemplo ilustra el problema:
import pandas as pd
def change1(s):
if s['a'] == 1:
s[['b', 'c']] = s[['c', 'b']].values
return s
def change2(s):
s[['b', 'c']] = s[['c', 'b']].values
return s
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
print('original:')
print(df)
df = df.apply(change1, axis = 1)
print('change1:')
print(df)
df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
df.loc[df['a']==1,:] = df.loc[df['a']==1,:].apply(change2, axis=1)
print('change2:')
print(df)
Mis preguntas son:
1. ¿Por qué la segunda estrategia (change2) no funciona, mientras que la primera sí?
2. ¿Cuál sería una forma más correcta y más rápida de hacer esto?
davy.ai
Una forma más correcta y rápida de hacer esto es usar el accesor loc para seleccionar las filas a cambiar y luego modificar las filas seleccionadas utilizando indexación booleana. Aquí hay un ejemplo de fragmento de código:
El código anterior selecciona las filas donde la columna ‘a’ es igual a 1 utilizando la indexación booleana y luego modifica las columnas ‘b’ y ‘c’ utilizando los valores de las columnas ‘c’ y ‘b’, respectivamente. Este método no requiere aplicar una función a cada fila y es mucho más rápido que el método apply, especialmente para conjuntos de datos grandes.