Pandas: добавление нового столбца в MultiIndex

У меня возникли проблемы с поиском способа добавления дополнительного столбца, содержащего сумму элементов в столбце корзины.

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

Я прав, когда думаю добавить дополнительный столбец, применив лямбда-функцию?

Ценю любую помощь или совет, спасибо.

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

1
50
2

Ответы:

Попробуйте сгруппировать по первому уровню, затем используйте .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