Este código agrupa una matriz N-por-2,

df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
df.groupby('a')['b'].apply(list)

Por los valores en la primera columna

[['A' '1']
 ['A' '2']
 ['B' '5']
 ['B' '5']
 ['B' '4']
 ['C' '6']]

Y obtener este resultado (salida_1)

a
A       [1, 2]
B    [5, 5, 4]
C          [6]
Name: b, dtype: object

Estoy tratando de hacer este trabajo sin pandas

from itertools import groupby
from operator import itemgetter
list(groupby(ds,key = itemgetter(0)))

Parece que agrupé la matriz de datos con éxito,

[('A', <itertools._grouper at 0x121f779e8>),
 ('B', <itertools._grouper at 0x121f77588>),
 ('C', <itertools._grouper at 0x121f77400>)]

En este momento, estoy atascado en obtener estos elementos.

list(list(groupby(ds,key = itemgetter(0)))[0][1])

Me dio una lista vacía []

¿Cómo obtener un grupo de listas como output_1 con python sin pandas?

3
user11683992 7 oct. 2019 a las 13:03

3 respuestas

La mejor respuesta

Puede usar defaultdict de colecciones.

from collections import defaultdict

my_dict = {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]}
results = defaultdict(list)
for index, value in zip(my_dict['a'], my_dict['b']:
    results[index].append(value)

Ahora que tenemos un valor agrupado para un índice dado, podemos volver a la salida deseada de esta manera

final = defaultdict(list)
for key, value in results.items():
    final["a"].append(key)
    final["b"].append(value)

El resultado final debería verse así:

{"a" : ["A", "B", "C"], "b" : [[1, 2], [5, 5, 4], [6]]} 
1
Florian Bernard 7 oct. 2019 a las 10:16
from collections import defaultdict

ds = [
    ['A', '1'],
    ['A', '2'],
    ['B', '5'],
    ['B', '5'],
    ['B', '4'],
    ['C', '6']]

groups = defaultdict(list)
for key, value in ds:
    groups[key].append(value)

print(groups)

Salida:

defaultdict(<class 'list'>, {'A': ['1', '2'], 'B': ['5', '5', '4'], 'C': ['6']})

Puede convertir el defaultdict a una lista, si lo desea con

list(groups.items())
0
gnvk 7 oct. 2019 a las 10:14

Como puede ver en su primer intento, groupby proporciona la clave y un iterador a cada elemento que se ajusta a la clave como cada uno de sus elementos.

Puede extraer los datos utilizando una lista de comprensión:

[(key, [elem[1] for elem in it]) for key, it in groupby(ds,key = itemgetter(0))]

O, como dice:

{key: [elem[1] for elem in it] for key, it in groupby(ds, key=itemgetter(0))}
1
301_Moved_Permanently 7 oct. 2019 a las 12:41
58267326