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'])

df

Función f:

def f(var1, var2):
    return [np.sum(var1)*10, np.sum(var2)*10]

Salida necesaria:

result_df

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?

0
bazinga 9 oct. 2019 a las 04:51

3 respuestas

La mejor respuesta

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.

3
Dani Mesejo 9 oct. 2019 a las 02:10

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
0
Andy L. 9 oct. 2019 a las 01:57

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
0
moys 9 oct. 2019 a las 02:01
58296014