Интересная pandas групповая путаница - PullRequest
0 голосов
/ 18 июня 2020

У меня путаница (и интересное наблюдение) относительно группировки по и суммы.

У меня есть набор данных NBA, в котором я выполняю следующие два независимых действия

A: df.groupby ( 'Team') ['Salary']. Sum ()

B:

gb1 = df.groupby (['Team', 'Position', 'College']) ['Salary '] .sum ()

gb2 = gb1.groupby (' Team ') [' Salary ']. sum ()

Вывод gb2 в части B отличается от вывода Часть A. Я хочу знать, почему это так? Я думаю, что это должно быть так же, поскольку в обоих методах (A и B) я эффективно группируюсь по командам и беру сумму зарплат. Тогда почему они разные?

1 Ответ

0 голосов
/ 29 июня 2020

Приведенный ниже код пытается воспроизвести вопрос. Проблема может заключаться в NaN или других недостающих значениях в столбцах Position и / или College.

Приведенные ниже ответы из двух методов группировки A и B из вопроса совпадают в этом пример.

  • Option # 1 и Option # 2 ответы ниже совпадают.
  • Option # 3 не соответствует из-за NaN.

Однако , как обсуждалось в комментариях, трудно точно знать, как выглядят данные в DataFrame, используемом в вопросе выше.

# Import libraries
import pandas as pd

# Create DataFrame
df = pd.DataFrame({
    'Team':['A','A','B','A','B','C','C','B'],
    'Salary':[1000,2000,300,5000,200,10000,12000,100],
    'College':['c1','c1','c2','c1','c2','c3','c3','c2'],
    'Position':[1,1,2,1,2,3,3,2],
    'College2':['c1','c2','c1','c1','c2','c2','c1','c2'],
    'Position2':[1,2,1,1,3,2,3,1],
    'College3':['c1','c2','c1','c1','c2','c2','c1','c2'],
    'Position3':[1,2,1,1,np.nan,2,3,1]
})

Метод: A

# Get groupby() sum
df.groupby(['Team'])['Salary'].sum()

Вывод

Team
A     8000
B      600
C    22000
Name: Salary, dtype: int64

Метод: B

Вариант №1 : Использование столбцов Position и College

gb1 = df.groupby(['Team', 'Position','College'])['Salary'].sum().reset_index()
gb2 = gb1.groupby(['Team'])['Salary'].sum()
gb2

Вывод

Team
A     8000
B      600
C    22000
Name: Salary, dtype: int64

Вариант № 2 : Использование столбцов Position2 и College2

gb1 = df.groupby(['Team', 'Position2','College2'])['Salary'].sum().reset_index()
gb2 = gb1.groupby(['Team'])['Salary'].sum()
gb2

Вывод

Team
A     8000
B      600
C    22000
Name: Salary, dtype: int64

Вариант № 3 : Использование столбцов Position3 и College3 (с NaN)

gb1 = df.groupby(['Team', 'Position3','College3'])['Salary'].sum().reset_index()
gb2 = gb1.groupby(['Team'])['Salary'].sum()
gb2

Вывод:

Team
A     8000
B      400
C    22000
Name: Salary, dtype: int64
...