Как правильно сгруппировать структуру данных, чтобы решить задачу?

Постановка задачи

Имеется следующая структура данных:

datas = [
         ['event1','id1','date1'],
         ['event2','id2','date1'],
         ['event2','id1','date2'],
         ['event1','id3','date1'],
         ['event2','id2','date1'],
         ['event1','id3','date2']
        ]

Где первая колонка - это название события, вторая - айдишник пользователя, третья - дата. Результатом нужно получить следующую структуру данных:

result =[['event1',2, 2, 'date1'],
         ['event2', 2, 1, 'date1'],
         ['event1',1, 1,'date2'],
         ['event2', 1, 1, 'date2']]

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

datas.sort(key=lambda x:(x[2), x[0])) Что дальше делать самостоятельно придумать не смог.


Ответы (2 шт):

Автор решения: Zombotron

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

Типа так:

datas = [
         ['event1','id1','date1'],
         ['event2','id2','date1'],
         ['event2','id1','date2'],
         ['event1','id3','date1'],
         ['event2','id2','date1'],
         ['event1','id3','date2']
        ]
separator = '-'
pre = dict()
i = 0
key = ''
while i < len(datas):
    key = datas[i][0]+ separator +datas[i][2]
    if key not in pre:
        pre[key] = []
    pre[key].append(datas[i][1])
    i = i + 1 # или i += 1
    
print(pre)

result = []
for key in pre:
    keys = key.split(separator)
    ids = pre[key]
    result.append([keys[0], len(ids), len(list(set(ids))), keys[1]])
print(result)

https://onlinegdb.com/tRIN-JepX

→ Ссылка
Автор решения: strawdog

При исходных данных

datas = [
         ['event1','id1','date1'],
         ['event2','id2','date1'],
         ['event2','id1','date2'],
         ['event1','id3','date1'],
         ['event2','id2','date1'],
         ['event1','id3','date2']
        ]

Использование pandas позволяет сделать, например, следующее:

import pandas as pd

df = pd.DataFrame(datas, columns=["event", "id","date"])
res = df.groupby(["event", "date"], as_index=False).agg({"event":'count',"id":"nunique", "date":"last"}).sort_values(["event", "date"], ascending=False)

теперь у вас есть датафрейм res:

   event  id   date
0      2   2  date1
2      2   1  date1
1      1   1  date2
3      1   1  date2
→ Ссылка