Я думаю, вам нужно сначала несколько столбцов, а затем агрегировать sum
:
df['Weight (oz.)'].mul(df['Quantity']).groupby(df['Category']).sum().reset_index(name='wsum')
Или:
(df.assign(wsum = df['Weight (oz.)'].mul(df['Quantity']))
.groupby('Category', as_index=False)['wsum'].sum())
Ваше решение должно быть изменено на несколько групп, но если оно большое DataFrame или многие группы это медленно:
df1 = (df.groupby('Category')
.apply(lambda x: (x['Weight (oz.)'] * x['Quantity']).sum()).reset_index(name='wsum'))
Я не знаю, почему это будет работать. Что именно Pandas передает анонимной функции? Всегда ли это сначала сам Dataframe, а затем имена столбцов (если указаны)?
Я думаю, что причина должна быть pandas в отображении лямбда-переменных, поэтому df
сопоставляется с каждой группой, a
сопоставляется со строкой Weight (oz.)
и b
со строкой Quantity
:
print(df.groupby('Category').apply(lambda df,a,b: print (df), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (a), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (b), 'Weight (oz.)', 'Quantity'))
Но это действительно не стандартный способ для pandas передачи имен столбцов в функциях.