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.

Suma de filas de un dataframe con índices de columna variables (Python)

Tengo un dataframe que tiene varios millones de filas. Necesito calcular la suma de cada fila desde un índice de columna específico hasta la última columna. El índice de columna para cada fila es único. Un ejemplo de esto, con la salida deseada, será:

import pandas as pd

df = pd.DataFrame({'col1': [1, 2, 2, 5, None, 4],
                   'col2': [4, 2, 4, 2, None, 1],
                   'col3': [6, 3, 8, 6, None, 4],
                   'col4': [9, 8, 9, 3, None, 5],
                   'col5': [1, 3, 0, 1, None, 7],
                   })

df_ind = pd.DataFrame({'ind': [1, 0, 3, 4, 3, 5]})

for i in df.index.to_list():
    df.loc[i, "total"] = df.loc[i][(df_ind.loc[i, "ind"]).astype(int):].sum()

print(df)

¿Cómo puedo lograr esto eficientemente con pandas sin usar un bucle for? Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto sin usar un bucle for es utilizando las funciones apply y lambda de pandas junto con el método iloc. Aquí tienes un ejemplo:

    import pandas as pd
    
    df = pd.DataFrame({'col1': [1, 2, 2, 5, None, 4],
                       'col2': [4, 2, 4, 2, None, 1],
                       'col3': [6, 3, 8, 6, None, 4],
                       'col4': [9, 8, 9, 3, None, 5],
                       'col5': [1, 3, 0, 1, None, 7],
                       })
    
    df_ind = pd.DataFrame({'ind': [1, 0, 3, 4, 3, 5]})
    
    df['total'] = df.apply(lambda row: row.iloc[df_ind.loc[row.name, 'ind']:].sum(), axis=1)
    
    print(df)
    

    Salida:

       col1  col2  col3  col4  col5  total
    0   1.0   4.0   6.0   9.0   1.0   20.0
    1   2.0   2.0   3.0   8.0   3.0   18.0
    2   2.0   4.0   8.0   9.0   0.0    9.0
    3   5.0   2.0   6.0   3.0   1.0    1.0
    4   NaN   NaN   NaN   NaN   NaN    0.0
    5   4.0   1.0   4.0   5.0   7.0    0.0
    

    En esta solución, utilizamos la función apply con el argumento axis=1, lo cual aplica la función lambda en cada fila del dataframe. La función lambda utiliza el método iloc para seleccionar las columnas desde el índice especificado en el dataframe df_ind hasta el final de la fila, y luego suma los valores seleccionados. Esto devuelve el dataframe de resultado deseado con la columna total que contiene la suma de los valores en cada fila.

Comments are closed.