Grupo de elementos de la lista de Python

Tengo una lista de python como sigue:

my_list = [[25, 1, 0.65], [25, 3, 0.63], [25, 2, 0.62], [50, 3, 0.65], [50, 2, 0.63], [50, 1, 0.62]] 

Quiero ordenarlos de acuerdo a esta regla:

 1 --> [0.65, 0.62]  [0.62, 0.63]  [0.63, 0.65] <--25, 50 

Entonces el resultado esperado es el siguiente:

 Result = [[0.65, 0.62],[0.62, 0.63],[0.63, 0.65]] 

¿Cómo hacerlo chicos?

Intenté lo siguiente:

 df = pd.DataFrame(my_list,columns=['a','b','c']) res = df.groupby(['b', 'c']).get_group('c') print res ValueError: must supply a tuple to get_group with multiple grouping keys 

Puede ordenar su lista con Python nativo, pero me resulta más fácil obtener su lista requerida usando numpy. Como ibas a usar pandas de todos modos, considero que esta es una solución aceptable:

 from operator import itemgetter import numpy as np # or just use pandas.np if you have that already imported my_list = [[25, 1, 0.65], [25, 3, 0.63], [25, 2, 0.62], [50, 3, 0.65], [50, 2, 0.63], [50, 1, 0.62]] sorted_list = sorted(my_list,key=itemgetter(1,0)) # sort by second and first column sliced_array = np.array(sorted_list)[:,-1].reshape(-1,2) final_list = sliced_array.tolist() # to get a list 

El punto principal es usar itemgetter para ordenar su lista en dos columnas una después de la otra. La lista ordenada resultante contiene los elementos necesarios en su tercera columna, que extraigo con numpy. Se podría hacer con Python nativo, pero si ya está usando Numpy / Pandas, esto debería ser natural.

Usa lo siguiente:

 my_list = [[25, 1, 0.65], [25, 3, 0.63], [25, 2, 0.62], [50, 3, 0.65], [50, 2, 0.63], [50, 1, 0.62]] list_25 = sorted([item for item in my_list if item[0] == 25], key=lambda item: item[1]) list_50 = sorted([item for item in my_list if item[0] == 50], key=lambda item: item[1]) res = [[i[2], j[2]] for i,j in zip(list_25, list_50)] 

Salida:

 >>> res [[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 

Una forma de hacer esto con pandas es extraer cada grupo, extraer 'c' , convertir a una lista y agregar a la lista que desee:

 z = [] >>> for g in df.groupby('b'): z.append(g[1]['c'].tolist()) >>> z [[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 

Usted podría hacer esto como una lista de comprensión:

 >>> res = [g[1]['c'].tolist() for g in df.groupby('b')] >>> res [[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 

Otra forma sería apply list directamente a df.groupby('b')['c'] esto le da el objeto que necesita. Luego llame al método .tolist() para devolver una lista de listas:

 >>> df.groupby('b')['c'].apply(list).tolist() [[0.65000000000000002, 0.62], [0.62, 0.63], [0.63, 0.65000000000000002]] 

El paquete numpy_indexed (descargo de responsabilidad: soy su autor) tiene una sola línea para este tipo de problemas:

 import numpy_indexed as npi my_list = np.asarray(my_list) keys, table = npi.Table(my_list[:, 1], my_list[:, 0]).mean(my_list[:, 2]) 

Tenga en cuenta que si hay valores duplicados en la lista, la media se indica en la tabla.

EDITAR: agregó algunas mejoras al maestro de numpy_indexed, que permiten un mayor control sobre la forma en que se convierte a una tabla; por ejemplo, existe Table.unique que afirma que cada elemento de la tabla aparece una vez en la lista, y Table.sum; y eventualmente todas las otras reducciones soportadas por el paquete numpy_indexed que tienen sentido. Espero poder hacer un nuevo lanzamiento para eso esta noche.