Подсчет общих элементов в списке, которые происходят в тот же день в кадре данных pandas - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть DataFrame, который выглядит так:

Users               Date
['A', 'B']        2017-10-21
['B', 'C']        2017-10-21
['A', 'D']        2017-10-21
['D', 'E']        2017-10-22
['A', 'E']        2017-10-22
['A', 'E', 'D']   2017-10-22
['C', 'B', 'E']   2017-10-23
['D', 'C', 'F']   2017-11-23

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

Например, новый DataFrame будет выглядеть так:

Users                        Date
[A=2, B=2, C=1, D=1]        2017-10-21
[E=3, D=2, A=2]             2017-10-22
[B=1, C=2, D=1, E=1, F=1]   2017-10-23

Некоторые вещи, на которые следует обратить внимание: все элементы в первом наборе данных являются списками, отдельные элементы которых являются строками. Столбец Дата имеет тип DateTime.

Я понимаю, что в столбце Date была бы функция groupby, но я не могу понять, как написать функцию, для которой я бы apply.

1 Ответ

0 голосов
/ 02 сентября 2018

Использование groupby и apply с collections.Counter:

df.groupby('Date').Users.sum().apply(collections.Counter, 1)

Date
2017-10-21    {'A': 2, 'B': 2, 'C': 1, 'D': 1}
2017-10-22            {'D': 2, 'E': 3, 'A': 2}
2017-10-23            {'C': 1, 'B': 1, 'E': 1}
2017-11-23            {'D': 1, 'C': 1, 'F': 1}
Name: Users, dtype: object

Если у вас есть несколько столбцов, которые вы хотите сосчитать на группу:

Настройка

s = 'ABCDE'

df = pd.DataFrame({
    'Users': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Tools': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Hours': [random.sample(s, random.randint(1, 5)) for _ in range(10)],
    'Date': ['2017-10-21', '2017-10-21', '2017-10-21', '2017-10-22',
    '2017-10-22', '2017-10-22', '2017-10-23', '2017-10-23', '2017-10-23', '2017-11-23']
})

Использование agg:

df.groupby('Date').sum().agg({
    'Users': collections.Counter,
    'Tools': collections.Counter,
    'Hours': collections.Counter
})

                                               Users                                     Tools                                     Hours
Date
2017-10-21  {'C': 2, 'E': 2, 'A': 2, 'B': 2, 'D': 1}  {'E': 3, 'A': 2, 'B': 3, 'D': 2, 'C': 2}  {'B': 2, 'C': 2, 'E': 1, 'A': 1, 'D': 1}
2017-10-22  {'D': 2, 'A': 2, 'E': 1, 'C': 1, 'B': 2}  {'E': 2, 'B': 3, 'A': 3, 'D': 1, 'C': 1}  {'B': 1, 'C': 2, 'E': 2, 'A': 2, 'D': 2}
2017-10-23  {'B': 2, 'A': 2, 'D': 1, 'E': 1, 'C': 2}  {'D': 3, 'E': 2, 'B': 2, 'C': 3, 'A': 2}  {'C': 3, 'E': 2, 'D': 2, 'B': 1, 'A': 2}
2017-11-23                  {'D': 1, 'B': 1, 'C': 1}                                  {'B': 1}                          {'C': 1, 'E': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...