Совокупное значение подсчета категориальных данных, с группировкой по - PullRequest
0 голосов
/ 23 января 2019

В моем фрейме данных у меня есть текстовый столбец group с именем группы и столбец drop_week, содержащий категориальное значение в диапазоне [1,4].Я хочу сохранить для каждой группы совокупное количество значений от 1 до 4 в неделю.Я делаю это:

drop_data = all_data[['group', 'drop_week']].groupby('group')['drop_week'] \
    .value_counts().unstack().transpose().fillna(0).cumsum().transpose()

и это работает.Но так как мне понадобилось 2 часа поиска в Google, я подумал, есть ли лучший способ сделать это.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете использовать pd.crosstab для создания таблицы частот.Затем используйте cumsum(axis=1) для вычисления совокупной суммы по каждой строке:

pd.crosstab(index=all_data['group'], columns=all_data['drop_week']).cumsum(axis=1)
# drop_week   1   2   3   4
# group                    
# 0          12  17  21  27
# 1           7  13  18  25
# 2           9  14  22  26
# 3           5  11  16  22

, что соответствует

drop_data = (all_data[['group', 'drop_week']].groupby('group')['drop_week']
             .value_counts().unstack().transpose().fillna(0).cumsum().transpose())
# drop_week   1   2   3   4
# group                    
# 0          12  17  21  27
# 1           7  13  18  25
# 2           9  14  22  26
# 3           5  11  16  22

Настройка, которую я использовал для этого, была:

import numpy as np
import pandas as pd
np.random.seed(2019)
N = 100
all_data = pd.DataFrame({'group':np.random.randint(4, size=N),
                         'drop_week':np.random.randint(1,5, size=N)})

drop_data = (all_data[['group', 'drop_week']].groupby('group')['drop_week']
             .value_counts().unstack().transpose().fillna(0).cumsum().transpose())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...