Получить имя группы и элементов группы в массиве - PullRequest
1 голос
/ 11 июня 2019

У меня есть этот фрейм данных:

df:
    A       B
0   a       class1
1   b       class12
2   a       class2
3   a       class1
4   b       class13

Итак, я группирую df следующим образом:

df=df.groupby(['A', 'B'])['B'].count()

и я получаю

A    B 
a    class1    2
     class2    1
b    class12   1
     class13   1

Затем мне нужно получить доступ к этим значениям, и я подумал сохранить их в массиве массивов, чтобы потом их можно было легко прочитать и представить эти данные в таблице, например:

array = [[a,[class1,1],[class2,1]],[b,[class12,1],[class13,1]]]

Какой лучший способ сделать это? Есть ли еще лучший вариант?

В моей реальной проблеме я не знаю, какие группы или элементы группы у меня будут, и после операции groupby мне нужно перечислить их все.

Спасибо

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

сжатое

[[n, [*d.B.value_counts().items()]] for n, d in df.groupby('A')]

[['a', [('class1', 2), ('class2', 1)]],
 ['b', [('class13', 1), ('class12', 1)]]]

Если вы хотите списки вместо кортежей

[[n, [*map(list, d.B.value_counts().items())]] for n, d in df.groupby('A')]

[['a', [['class1', 2], ['class2', 1]]],
 ['b', [['class13', 1], ['class12', 1]]]]

dict

d = {}
for a, b in df.itertuples(index=False):
    d.setdefault(a, {}).setdefault(b, 0)
    d[a][b] += 1

[[k, [*map(list, v.items())]] for k, v in d.items()]

[['a', [['class1', 2], ['class2', 1]]],
 ['b', [['class12', 1], ['class13', 1]]]]
1 голос
/ 11 июня 2019

В вашем случае

df.groupby(['A', 'B']).size().reset_index(level=1).apply(list,1).\
    groupby(level=0).\
     apply(list).reset_index().values.tolist()
Out[125]: 
[['a', [['class1', 2], ['class2', 1]]],
 ['b', [['class12', 1], ['class13', 1]]]]
...