GroupBy ваш друг здесь.Я не нашел никаких ссылок на файл Excel.Я предполагаю, что у вас есть лист для конкурента с информацией о настроениях (я думаю, 1 и 0).Первое, что вам нужно сделать, это добавить имя участника.Вы можете сделать это двумя способами, либо добавить его в сам лист Excel, либо после прочтения листа Excel следующим образом:
df1 = pd.read_excel(PATH_DATA, 'A')
df1['competitor'] = 'A'
Это добавит столбец с именем Competitor со значением 'A'.В вашем случае значение конкурента имеет важное значение, потому что вы будете агрегировать по этой стоимости.После того, как вы сделали это только для всех фреймов данных, вы должны объединить их:
df_ALL = pd.concat([df1, df2, df3, df4, df5])
После этого вы можете применить групповую обработку к фрейму данных:
df_grouped = df_All.groupby(by='competitor',as_index = False).sum()
EDIT : решение на основе классов
class Report:
def __init__(self,dataframe):
self.data = dataframe
def ACbysentiment(self, vdimention, hdimention):
data = self.data
data = data.groupby(by=[vdimention, hdimention],as_index=False).sum()
data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')
data['Total'] = data.sum(axis=1)
#data.fillna(0, inplace = True) not required as we are aggregating
data = data.sort_values('Total', ascending=True)
return data
Примечание : метод init требуется для передачи кадра данных в класс.Ваш текущий код вызывает исключение.
Также обратите внимание, что я использовал groupby с as_index = False.Это позволяет групповой стиль SQL, который вы ищете.Таким образом, вы можете заменить:
data = data.groupby([vdimention, hdimention]).size().unstack(1)
на
data = data.groupby(by=[vdimention, hdimention],as_index=False).sum()
Наконец, если я правильно понимаю, вы хотите (в терминах Excel) повернуть данные так, чтобы мы использовали df.Pivot () метод:
data = data.pivot(index='Competitor',columns = 'Sentiment simplified',values='Adjusted Count')
Я также думаю, что вам не нужны различные «измерения», которые вы определили (если только они не используются в другом месте вашего кода).Вам просто нужно два:
COMPETITOR_DIMENTION = 'Competitor' # just the name of the column,case sensitive
AC_DIMENTION = 'Sentiment simplified'
, а затем:
S1_Competitor_Sentiment_AC = S1.ACbysentiment(COMPETITOR_DIMENTION, AC_DIMENTION)
Это вернет кадр данных pandas с желаемым выходом.
Надеюсь, это поможет!