@ Л.Чу ты прав в своем понимании. Он считает размер каждой группы.

я есть следующий массив данных Pandas:

Name   | EventSignupNo | Attended | Points
Smith  | 0145          | Y        | 20.24
Smith  | 0174          | Y        | 29.14
Smith  | 0239          | N        | 0
Adams  | 0145          | N        | 0
Adams  | 0174          | Y        | 33.43
Morgan | 0239          | Y        | 31.23
Morgan | 0244          | Y        | 23.15

и что я хотел бы, так это подсчет количества посещенных и не посещенных мероприятий на человека и суммы их баллов на человека. Итак, я делаю группу:df.groupby([Name, Attended]).agg({"Attended": "count", "Points": "sum"}).rename(columns = {"Attended: "Count"}).reset_index()

что даст мне что-то вроде:

Name   | Attended | Count | Points
Smith  | Y        | 2     | 49.38
Smith  | N        | 1     | 0
Adams  | Y        | 1     | 33.43
Adams  | N        | 1     | 0
Morgan | Y        | 2     | 54.38

но я бы хотел что-то вроде:

Name   | Attended | Count | Points
Smith  | Y        | 2     | 49.38
Smith  | N        | 1     | 0
Adams  | Y        | 1     | 33.43
Adams  | N        | 1     | 0
Morgan | Y        | 2     | 54.38
Morgan | N        | 0     | 0

Я попытался поиграться с pd.MultiIndex, чтобы попытаться заполнить отсутствующий счетчик нулей, но безрезультатно. Я читал другие подобные вопросы, но у меня возникают проблемы при работе со столбцом непрерывных точек с использованием MultiIndex. есть идеи как это сделать?

Ответы на вопрос(1)

Решение Вопроса

Вы могли бы сделать это сgroupby + agg, Для вашего точного вывода сY а такжеN на каждом уровне вам нужноreindex:

g = df.groupby(['Name', 'Attended'], sort=False).Points.agg(['count', 'sum'])

g
                 count    sum
Name   Attended              
Smith  Y             2  49.38
       N             1   0.00
Adams  N             1   0.00
       Y             1  33.43
Morgan Y             2  54.38
idx = pd.MultiIndex.from_product([g.index.levels[0], ['Y', 'N']])

idx
MultiIndex(levels=[['Adams', 'Morgan', 'Smith'], ['N', 'Y']],
           labels=[[2, 2, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0]])


g.reindex(idx, fill_value=0)

          count    sum
Smith  Y      2  49.38
       N      1   0.00
Adams  Y      1  33.43
       N      1   0.00
Morgan Y      2  54.38
       N      0   0.00
 L. Chu19 нояб. 2017 г., 02:45
@COLDSPEED: ответьте на следующий вопрос: вышеприведенное работает, и я заметил, что вы изменили агрегирование на "... .Points.agg ()". Идиоматически мне это читается как агрегация по точкам. Поскольку он суммирует баллы, будет ли справедливым сказать, что он «подсчитывает» баллы по событию в отношении группы ['Name', 'Attended']? Часть счета кажется мне странной.
 coldspeed19 нояб. 2017 г., 03:25
@ Л.Чу ты прав в своем понимании. Он считает размер каждой группы.

Ваш ответ на вопрос