Python - Agrupar tabla

 
Vista:
sin imagen de perfil
Val: 46
Ha aumentado su posición en 52 puestos en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Marta (30 intervenciones) el 14/01/2020 23:48:55
Hola,

tengo este df:
1
df = pd.DataFrame({'A': ["aa", "bb", "aa", "cc", "bb","cc"],'B': ["casa", "libro", "arbol", "lapiz","goma","gato"],'C': [12, 2, 7, 3, 6,9]}, columns=['A', 'B', 'C'])

y quiero agruparlo por la columna A de forma que me de la columna B segun el mayor C

por ejemplo si hago
1
df.groupby(["A"])['C'].max()

Me daria la columna A segun el mayor C.
Lo que quiero es que me de la columna B
algo asi

aa casa
bb goma
cc gato.

No se si tengo que hacerlo con indices o poniendo algo mas en groupby
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 388
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Daniel (111 intervenciones) el 15/01/2020 12:40:13
Hola,

Lo que se pide se puede hacer con las agregaciones por nombre que trae como novedad pandas 0.25. Esto es, se puede conseguir algo con este código

1
2
3
4
5
6
7
8
import pandas as pd
 
df = pd.DataFrame({'A': ["aa", "bb", "aa", "cc", "bb","cc"],
                   'B': ["casa", "libro", "arbol", "lapiz","goma","gato"],
                   'C': [12, 2, 7, 3, 6,9]},
                  columns=['A', 'B', 'C'])
 
df.groupby(['A', 'B']).agg(minimum_C = pd.NamedAgg(column='C', aggfunc='max'))

Saludos,
Daniel Rodríguez.
Analytics Lane
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 46
Ha aumentado su posición en 52 puestos en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Marta (30 intervenciones) el 15/01/2020 13:00:10
hola,

tu resultado me devuelvo esto:
1
2
3
4
5
6
aa arbol 7
   casa 12
bb goma 6
 libro 2
cc gato 9
 lapiz  3


cuando el resultado que busco seria este:


aa casa
bb goma
cc gato


el mayor de cada grupo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 388
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Daniel (111 intervenciones) el 15/01/2020 14:30:09
Ahora rápido no se me ocurre una manera más elegante

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
 
df = pd.DataFrame({'A': ["aa", "bb", "aa", "cc", "bb","cc"],
                   'B': ["casa", "libro", "arbol", "lapiz","goma","gato"],
                   'C': [12, 2, 7, 3, 6,9]},
                  columns=['A', 'B', 'C'])
 
def myMax(data):
    if (data[0][1] > data[2][1]):
        return data[0]
    else:
        return data[2]
 
df['result'] = list(zip(df.B, df.C))
df = df.groupby(['A']).agg(result = pd.NamedAgg('result', myMax))
df['result'] = df['result'].apply(lambda row: row[0])
df
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 46
Ha aumentado su posición en 52 puestos en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Marta (30 intervenciones) el 16/01/2020 11:39:10
jope, pensaba q seria algo mas trivial.

Muchas gracias!!!

Lo malo q veo es q el codigo esta pensado para el ejemplo en concreto, si por ejemplo cambio en el df
el orden de la columna A ya no funciona. Por ejemplo poniendo A': ["aa", "aa", "bb", "bb", "cc","cc"].
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 388
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Daniel (111 intervenciones) el 16/01/2020 20:05:00
Si, hay que decicarle algo más de tiempo. Pero creo que esta versión puede funcionar bien.

1
2
df['result'] = df[['B', 'C']].apply(tuple, axis=1)
df = df.groupby('A').agg(result = pd.NamedAgg('result', lambda data: data.apply(lambda row: row[0])[data.apply(lambda row: row[1]).idxmax()]))

Lo que no sé es cómo eliminar tener que usar una tupla intermedia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 388
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Daniel (111 intervenciones) el 16/01/2020 20:22:28
En una línea

1
df.apply(lambda row: (row[0], (row[1], row[2])), 1, result_type='expand').groupby(0).agg(result = (1, lambda data: data.apply(lambda row: row[0])[data.apply(lambda row: row[1]).idxmax()]))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 388
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Daniel (111 intervenciones) el 16/01/2020 20:42:46
Finalmente creo que esa solución es la más elegante:

1
2
3
4
5
6
7
8
import pandas as pd
 
df = pd.DataFrame({'A': ["aa", "bb", "aa", "cc", "bb","cc"],
                   'B': ["casa", "libro", "arbol", "lapiz","goma","gato"],
                   'C': [12, 2, 7, 3, 6,9]},
                  columns=['A', 'B', 'C'])
 
df.iloc[df.groupby('A').agg(result = ('C', lambda data: data.idxmax())).result][['A', 'B']]

¡Si lo piensas es bastante sencilla!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 46
Ha aumentado su posición en 52 puestos en Python (en relación al último mes)
Gráfica de Python

Agrupar tabla

Publicado por Marta (30 intervenciones) el 17/01/2020 00:14:01
Muchas gracias!!!

De sencillo nada, bastante más complicado de lo que parecía en un principio, pero como siempre pasa, una vez hecho parece fácil
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar