Pandas группируют по нескольким столбцам, но должны показывать уникальное значение в столбце после groupby

#python #pandas #dataframe #pandas-groupby #jupyter

#питон #pandas #фрейм данных #панды-группировка #юпитер #python #pandas-groupby #jupyter

Вопрос:

У меня есть фрейм данных, подобный приведенному ниже:

     Supplier_number Supplier_name   Supply_cat  USD
0   111               A             Cat_1        1
1   221               B             Cat_1        2
2   222               B             Cat_1        3
3   331               C             Cat_1        4
4   332               C             Cat_2        5
5   441               D             Cat_1        6
6   551               E             Cat_2        7
7   552               E             Cat_1        8
  

Затем я запускаю приведенные ниже строки и возвращаю df ниже:

 df_2a = df.groupby(['Supplier_number','Supplier_name', 'Supply_cat', ], as_index = False).sum().sort_values('USD')

    Supplier_number Supplier_name   Supply_cat  USD
0   111             A               Cat_1       1
1   221             B               Cat_1       2
2   222             B               Cat_1       3
3   331             C               Cat_1       4
4   332             C               Cat_2       5
5   441             D               Cat_1       6
6   551             E               Cat_2       7
7   552             E               Cat_1       8
  

Однако df, который я хотел бы получить, похож на приведенный ниже

 Supplier_number Supplier_name   Supply_cat     USD
0   111             A               Cat_1       1
**1 221             B               Cat_1       5
2   222**                                       
3   331             C               Cat_1       4
4   332             C               Cat_2       5
5   441             D               Cat_1       6
6   551             E               Cat_2       7
7   552             E               Cat_1       8
  

Логика: одно и то же имя поставщика, одна и та же категория поставки, несколько номеров поставщиков — Группируйте имя поставщика и категорию поставки, суммируйте USD, но оставьте номер поставщика без изменений.

Ответ №1:

фрейм данных будет иметь тот же размер, что и оригинал. Таким образом, мы можем сначала рассчитать USD, а затем поместить повторяющиеся ячейки NaN . Мы можем попробовать с GroupBy.transform sum , чтобы получить USD столбец. Затем вы можете mask дублировать с DataFrame.duplicated

 columns_group = ['Supplier_name', 'Supply_cat']
mask_columns = df.columns.difference(['Supplier_number'])
df['USD'] = df.groupby(columns_group)['USD'].transform('sum')
df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group))

#if you want blanks instead NaN
#df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group), '')


print(df)
  

Вывод

    Supplier_number Supplier_name Supply_cat  USD
0              111             A      Cat_1  1.0
1              221             B      Cat_1  5.0
2              222           NaN        NaN  NaN
3              331             C      Cat_1  4.0
4              332             C      Cat_2  5.0
5              441             D      Cat_1  6.0
6              551             E      Cat_2  7.0
7              552             E      Cat_1  8.0