es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. La segunda estrategia (cambio2) no funciona porque reemplaza las filas completas con las filas modificadas devueltas por la función apply. Sin embargo, las filas modificadas tienen un índice diferente al de las filas originales, lo que hace que se pierda el índice original y se reemplace por un nuevo índice que va desde 0 hasta el número de filas modificadas. Por lo tanto, las filas originales no se cambian como se esperaba.
    2. 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:

    df.loc[df['a'] == 1, ['b', 'c']] = df.loc[df['a'] == 1, ['c', 'b']].values
    

    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.

Comments are closed.