#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