У меня возникли проблемы с поиском способа добавления дополнительного столбца, содержащего сумму элементов в столбце корзины.
Это потому, что мне нужен способ показывать корзины, в которых позже будет меньше, чем очень много элементов. Но все равно нужно видеть индивидуальное количество.
Я прав, когда думаю добавить дополнительный столбец, применив лямбда-функцию?
Ценю любую помощь или совет, спасибо.
data = [['Jacket 1', 10, 'A'], ['Jacket 2', 2, 'A'], ['Jacket 3', 1, 'B'], ['Jacket 4', 3, 'B']]
df = pd.DataFrame(data, columns=['item', 'qty', 'bin'])
df
item qty bin
0 Jacket 1 10 A
1 Jacket 2 2 A
2 Jacket 3 1 B
3 Jacket 4 3 B
grouped = df.groupby(['bin', 'item']).agg({'qty' : 'sum'})
grouped
qty
bin item
A Jacket 1 10
Jacket 2 2
B Jacket 3 1
Jacket 4 3
Ниже представлено желание, которое я пытаюсь получить. Если это возможно?
qty Total
bin item
A Jacket 1 10 12
Jacket 2 2
B Jacket 3 1 4
Jacket 4 3
Попробуйте сгруппировать по первому уровню, затем используйте .where()
вместе с дубликатом, чтобы сохранить только первую запись.
grouped.assign(
Total = grouped.groupby(level=0)['qty'].transform('sum')
.where(~grouped.droplevel(1).index.duplicated())
)
Выход:
qty Total
bin item
A Jacket 1 10 12.0
Jacket 2 2 NaN
B Jacket 3 1 4.0
Jacket 4 3 NaN
Если вы действительно хотите проявить творческий подход и использовать оператор моржа, вы можете сделать это в одной строке:
(dfs:=df.groupby(['bin', 'item']).agg({'qty' : 'sum'})).assign(total = dfs.groupby('bin')['qty'].transform('sum').drop_duplicates())
Выход:
qty total
bin item
A Jacket 1 10 12.0
Jacket 2 2 NaN
B Jacket 3 1 4.0
Jacket 4 3 NaN