Понимание Pandas сумма grouby () - PullRequest
0 голосов
/ 27 января 2020

Я не могу понять, как работает sum () в случае groupby (). Официальные документы говорят, что он вычисляет сумму значений, но я не вижу, как:

df = pd.DataFrame({'A': [1, 1, 2, 1, 2],
               'B': [np.nan, 2, 3, 4, 5],
               'C': [1, 2, 1, 1, 2]},
               columns=['A', 'B', 'C'])

enter image description here

Не знаю Посмотрите, как он вычислил результат, он определенно не делал A + B + C для каждой строки.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Ваш пример довольно плох, но позвольте мне объяснить.

Группировка - это операция, которая принимает значение столбца и объединяет все равные значения вместе. Теперь нам нужна операция для работы с другими столбцами. Потому что при слиянии программа должна знать, как с ними бороться. И это будет сумма операции. (Другие операции: среднее, счет, ...)

В вашем случае у вас есть только уникальное значение в B, и поэтому нет двух строк, которые объединяются вместе. Следовательно, какова сумма одного элемента? именно элемент.

l = [3]
print(sum(l)) # Output: 3

И это то, что происходит в вашем примере.

Вот почему @ jezrael сказал в комментарии, который вы, вероятно, хотите сделать df = df.groupby('A').sum()

Вывод будет:

     B  C
A        
1  6.0  4
2  8.0  3

As Вы видите, что мы группируем по столбцу A. Строки 1 и 3 добавляются вместе, а строки 2 и 4.

Возможно, вы ищете это:

df.sum()

, который выдает:

A     7.0
B    14.0
C     7.0

Или это упоминается @ Andrea :

df.sum(axis=1)

, который выдает:

0    2.0
1    5.0
2    6.0
3    6.0
4    9.0

Но Groupby - неправильный способ достичь того, что вы хотите Я думаю.

0 голосов
/ 27 января 2020

Это можно понять, сравнив следующие 2 кадра данных: -

Пусть кадр данных будет

original_dataframe

Doing df.groupby('B').sum() дает

groupbyB

, в то время как, df.groupby('A').sum() дает

groupbyA

* 1025 Итак, что делает groupby (). Sum (), так это то, что он берет элемент B, добавляет соответствующий элемент строки в A и C, а затем ищет повторение этого элемента в столбце B. Если он найден, он снова добавляет соответствующее значение A и C. Если он не найден, он переходит к следующему элементу в столбце B. Для более подробного объяснения в приведенном выше примере берется первый B = 2.0, для которого A = 1 и C = 2. Поскольку 2.0 не повторяется в столбце B теперь он переходит к B = 3.0, для которого A = 2 и C = 1, и так далее. Это вывод для groupby ('B'). Sum (). С другой стороны, когда df.groupby ('A') готов, сначала A = 1. Для этого соответствующие значения B = NaN, C = 1. Так как 1 повторяется в столбце A, sumB = NaN + 2.0 + 4.0 = 6, сумма C = 1 + 2 + 1 = 4. Теперь, когда все значения для A = 1 сделаны, оно переходит к A = 2. Опять же, для A = 2, sumB = 3.0 + 5.0 = 8 и sum C = 1 + 2 = 3. Это объясняет вывод, когда groupby ( «А») было сделано.

Для вашей задачи df.sum() даст сумму всех 3 столбцов как

A   7.0
B   14.0
C   7.0

Если вы хотите получить сумму по строке, выполните df.sum(axis = 1) Это даст

0   2.0
1   5.0
2   6.0
3   6.0
4   9.0
...