Groupby pandas бросая ValueError: Grouper и ось должны быть одинаковой длины - PullRequest
1 голос
/ 28 апреля 2020

У меня есть CSV ниже

ID,PR_No,PMO,PRO,REV,COST
111,111,AB,MA,2575,2575
111,111,AB,MA,-1137,-1137
112,112,CD,KB,1134,3334
111,111,AB,MA,100,100

Вывод, как показано ниже

ID,PR_No,PMO,PRO,REV,COST
111,111,AB,MA,1538,1538
112,112,CD,KB,1134,3334

1538 = 2575-1137 + 100

Мой код выбрасывает значения ошибки

df_n = df.groupby([['ID','PR_No','PMO','PRO']]).agg({'REV':sum,'COST':sum})

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Удалить вложенный [] для списка имен столбцов:

df_n = df.groupby(['ID','PR_No','PMO','PRO']).agg({'REV':sum,'COST':sum})
print (df_n)
                    REV  COST
ID  PR_No PMO PRO            
111 111   AB  MA   1538  1538
112 112   CD  KB   1134  3334

Поскольку такая же агрегатная функция возможна, создайте список после группировки с помощью .sum:

df_n = df.groupby(['ID','PR_No','PMO','PRO'])['REV','COST'].sum()

ValueError: Grouper и ось должны быть одинаковой длины

Что это значит?

Если работать с образцами данных, это работает, потому что длина вложенного списка такая же, как длина примерные данные:

df_n = df.groupby([['ID','PR_No','PMO','PRO']]).agg({'REV':sum,'COST':sum})
print (df_n)
        REV  COST
ID     2575  2575
PMO    1134  3334
PRO     100   100
PR_No -1137 -1137

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

df_n = df.groupby([['ID','ID','PRO','PRO']]).agg({'REV':sum,'COST':sum})
print (df_n)
      REV  COST
ID   1438  1438
PRO  1234  3434

Но если длина отличается, это не удалось:

print (df)
    ID  PR_No PMO PRO   REV  COST
0  111    111  AB  MA  2575  2575
1  111    111  AB  MA -1137 -1137
2  112    112  CD  KB  1134  3334
3  111    111  AB  MA   100   100
4  111    111  AB  MA   100   100 <- added new row

df_n = df.groupby([['ID','ID','PRO','PRO']]).agg({'REV':sum,'COST':sum})
print (df_n)

ValueError: Grouper и ось должны быть одинаковой длины

0 голосов
/ 28 апреля 2020

Попробуйте с какой-нибудь функцией agg или sum это сработает ...

df_n = df.groupby([......])[....].sum()
...