Предположим, что ваш dataframe имеет имя df
. Вы можете получить номера строк для каждого идентификатора с помощью df.groupby('ID').groups
:
group_rows = df.groupby('ID').groups
Мы будем перебирать каждую группу ID, а затем использовать Counter
для подсчета значений в Col1
и Col2
. Затем я добавлю их в словарь.
from collections import Counter
my_dict = {}
for group_id, rows in group_rows.iteritems():
c = Counter(df.iloc[rows, 1]) # 1 = index number for `Col1`
c.update(df.iloc[rows, 2]) # 2 = index number for `Col2`
my_dict[group_id] = dict(c)
>>> my_dict
{1: {'A': 2, 'B': 1, 'Y': 1, 'Z': 2},
2: {'A': 1, 'C': 1, 'P': 1, 'X': 1}}
Я выбрал для вывода результатов в словарь вместо необходимого список таким образом, что связь между группой ID
и подсчитанных значениями явно. Если это проблема, я могу преобразовать их в список, предположив, что dataframe сначала сортируется столбцом ID
.
keys = my_dict.keys()
keys.sort()
my_list = [my_dict[k] for k in keys]
>>> my_list
[{'A': 2, 'B': 1, 'Y': 1, 'Z': 2}, {'A': 1, 'C': 1, 'P': 1, 'X': 1}]