Entrada de muestra:
df = pd.DataFrame(data = [[0,1,2,3], [0,1,3,4], [0,2,5,6], [0,2,7,8]], columns=['id1', 'id2', 'var1', 'var2'])
Función f:
def f(var1, var2):
return [np.sum(var1)*10, np.sum(var2)*10]
Salida necesaria:
El método que he usado para generar esto es:
result_df = pd.DataFrame(df.groupby(['id1', 'id2'])['var1', 'var2'].apply(lambda x: f(x['var1'], x['var2'])))
pd.DataFrame(result_df[0].tolist(), columns=['result_var1', 'result_var2'], index=result_df.index).reset_index()
¿Hay algún método mejor disponible para generar un marco de datos aplicando una función en un objeto pandas groupby, y la función devuelve múltiples valores?
3 respuestas
Utilice agg :
result = df.groupby(['id1', 'id2'], as_index=False).agg(lambda x: x.sum() * 10)
print(result)
Salida
id1 id2 var1 var2
0 0 1 50 70
1 0 2 120 140
Una aplicación más general de agg es la siguiente:
def general_var1(x):
return x.sum() * 10
def general_var2(x):
return x.sum() * 5 + 2
result = df.groupby(['id1', 'id2'], as_index=False).agg({'var1': general_var1, 'var2': general_var2})
Salida
id1 id2 var1 var2
0 0 1 50 37
1 0 2 120 72
Se pueden encontrar más ejemplos en la documentación vinculada.
Probar esto
(df.groupby(['id1', 'id2']).sum() * 10).reset_index()
Out[247]:
id1 id2 var1 var2
0 0 1 50 70
1 0 2 120 140
Si lo necesita exactamente como lo tiene (incluso con los nombres de columna cambiados), use el código a continuación.
(df.groupby(['id1', 'id2'])['var1', 'var2'].sum()*10).add_prefix('result_').reset_index()
Salida
id1 id2 result_var1 result_var2
0 0 1 50 70
1 0 2 120 140
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.