Kelfindel
Kelfindel

Reputation: 13

I need to groupby and overwrite a column with min-max value

I need to set the last column like min%-max% but i didn't find any solution, im working from a csv and need to write again.

zona;rango;nombre;porcentaje
Yermo de Agujas;Rango Alto;Hueso monstruo pequeño;45
Yermo de Agujas;Rango Alto;Hueso escogido;30
Yermo de Agujas;Rango Alto;Hueso fósil;20
Yermo de Agujas;Rango Alto;Reliquia de dracohueso;5
Yermo de Agujas;Rango Alto;Hueso monstruo pequeño;23
Yermo de Agujas;Rango Alto;Hueso escogido;40
Yermo de Agujas;Rango Alto;Hueso fósil;30
Yermo de Agujas;Rango Alto;Reliquia de dracohueso;7

y need somthing like:

zona;rango;nombre;porcentaje
Yermo de Agujas;Rango Alto;Hueso monstruo pequeño;23-45
Yermo de Agujas;Rango Alto;Hueso escogido;30-40
Yermo de Agujas;Rango Alto;Hueso fósil;20-30
Yermo de Agujas;Rango Alto;Reliquia de dracohueso;5-7

i have tried

df.groupby(['zona', 'rango', 'nombre'])
df.agg({'porcentaje': [np.min,np.max]})
df.groupby(['zona', 'rango', 'nombre'])['porcentaje'].transform(lambda x: '-'.join(x))

any ideas?

Upvotes: 0

Views: 76

Answers (1)

Quang Hoang
Quang Hoang

Reputation: 150785

Try:

(df.groupby(['zona','rango', 'nombre'])['porcentaje']
   .agg(['min','max'])
   .astype(str)
   .agg('-'.join, axis=1)
   .reset_index(name='porcentaje')
)

Output:

              zona       rango                  nombre porcentaje
0  Yermo de Agujas  Rango Alto          Hueso escogido      30-40
1  Yermo de Agujas  Rango Alto             Hueso fósil      20-30
2  Yermo de Agujas  Rango Alto  Hueso monstruo pequeño      23-45
3  Yermo de Agujas  Rango Alto  Reliquia de dracohueso        5-7

Upvotes: 2

Related Questions