попытка создать сводную таблицу с помощью pandas и numpy

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

Я использую следующее, чтобы попытаться получить сводную таблицу, которая умножает количество, умноженное на эффективную цену, и группирует его по названию продукта:

df_sorted.pivot_table(values=['Quantity', 'EffectivePrice'], index=['ProductName'], aggfunc=np.multiply )

Это трассировка стека — не уверен, почему это не работает.

 ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.9/site-packages/pandas/core/groupby/generic.py in aggregate(self, func, engine, engine_kwargs, *args, **kwargs)
    970                 try:
--> 971                     result = self._aggregate_multiple_funcs([func], _axis=self.axis)
    972 

/usr/local/lib/python3.9/site-packages/pandas/core/base.py in _aggregate_multiple_funcs(self, arg, _axis)
    544         if not len(results):
--> 545             raise ValueError("no results")
    546 

ValueError: no results

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-35-f616d7b46a13> in <module>
----> 1 df_sorted.pivot_table(values=['Quantity', 'EffectivePrice'], index=['ProductName'], aggfunc=np.multiply )

/usr/local/lib/python3.9/site-packages/pandas/core/frame.py in pivot_table(self, values, index, columns, aggfunc, fill_value, margins, dropna, margins_name, observed)
   6824         from pandas.core.reshape.pivot import pivot_table
   6825 
-> 6826         return pivot_table(
   6827             self,
   6828             values=values,

/usr/local/lib/python3.9/site-packages/pandas/core/reshape/pivot.py in pivot_table(data, values, index, columns, aggfunc, fill_value, margins, dropna, margins_name, observed)
    110 
    111     grouped = data.groupby(keys, observed=observed)
--> 112     agged = grouped.agg(aggfunc)
    113     if dropna and isinstance(agged, ABCDataFrame) and len(agged.columns):
    114         agged = agged.dropna(how="all")

/usr/local/lib/python3.9/site-packages/pandas/core/groupby/generic.py in aggregate(self, func, engine, engine_kwargs, *args, **kwargs)
    981                         # raised directly by _aggregate_multiple_funcs
    982                         raise
--> 983                     result = self._aggregate_frame(func)
    984                 except AttributeError:
    985                     # catch exception from line 969

/usr/local/lib/python3.9/site-packages/pandas/core/groupby/generic.py in _aggregate_frame(self, func, *args, **kwargs)
   1173         if axis != obj._info_axis_number:
   1174             for name, data in self:
-> 1175                 fres = func(data, *args, **kwargs)
   1176                 result[name] = fres
   1177         else:

ValueError: invalid number of arguments```
  

Комментарии:

1. можете ли вы опубликовать образец набора данных?

Ответ №1:

Насколько я понимаю, вы не можете применить многоколоночную операцию в сводной таблице. Возможно, использование groupby transform может сделать. Основываясь на объяснении, я рекомендую этот код (я не уверен, что ожидаемый результат — это то, что вы хотите):

 df_sorted['TotalPrice'] = df_sorted['Quantity']*df_sorted['EffectivePrice']
result = df_sorted.groupby('ProductName')['TotalPrice'].sum()
  

Для этого примера фрейма данных:

    Quantity  EffectivePrice ProductName
0         1              12           A
1         1              13           B
2         2              14           A
  

Результат выглядит следующим образом:

 ProductName
A    40
B    13