Используйте pandas groupby для группировки нескольких столбцов

Я импортировал файл .xlsx с несколькими вкладками (около 3 миллионов строк), где заголовки столбцов существуют только на первой вкладке, а только данные без заголовков на остальных вкладках. Теперь у меня есть файл данных pandas с некоторой информацией, которую не нужно удалять;

import pandas as pd

#load in .xlsx with multiple tabs as a dataframe
filepath = "Consumption_20221111_testdata.xlsx"
df_dict = pd.read_excel(filepath, sheet_name=None, header=None)
df_all = pd.concat(df_dict.values(), ignore_index=True)
df_all = df_all.drop(columns=df_all.columns[2]) #remove column "PERIOD_ID"
df_all = df_all.drop(columns=df_all.columns[2]) #remove column "DATA_FLAG"
df_all = df_all.drop(df_all.index[-1]) #remove the last row (details of query run on SQL database that produced .xlsx which is the last tab of the .xlsx)
df_all = df_all.dropna(how='all') #remove columns that are all 'NaN'
df_all[1] = pd.to_datetime(df_all[1][1]) #convert column from object to datetime
print(df_all)
print(df_all.dtypes)

В моем кадре данных есть индекс, отмеченный для столбца и строк, но столбец даты теперь имеет дату вместо заголовка?

0 1 4 0 ССЫЛКА 2022-10-12 МИНУСЫ 1 REF1 2022-10-12 0,262 2 REF2 2022-10-12 0,259 3 REF2 2022-10-12 0,405

Мне нужно сгруппировать данные по ссылке и дате, агрегируя потребление, чтобы сравнивать месяц с месяцем, но сначала мне нужно иметь фрейм данных, на который я могу ссылаться!

df_all["Month"] = df_all[1].dt.month
df_all = df_all.groupby(by=[1, "Month"], as_index=False).agg({"CONS":sum})
df_all

привело к;

KeyError: «Столбцы ['CONS'] не существуют»

0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот предложение, использующее цепочку методов:

df_all = (
            pd.concat(pd.read_excel("Consumption_20221111_testdata.xlsx",
                                    header=None, sheet_name=None), ignore_index=True)
                .T.set_index(0).T
                .rename_axis(None, axis=1)
                .loc[:, ["REF", "DATE", "CONS"]]
                .assign(MONTH= lambda x: x["DATE"].dt.month)
                .groupby(by=["DATE", "MONTH"], as_index=False).agg({"CONS":sum})
         )

# Выход :

​
print(df_all)

        DATE  MONTH  CONS
0 2022-10-12     10  5.25

NB: ввод Excel был сделан с некоторыми строками, которые вы разделили, а также с некоторыми случайными значениями.

Трассировка (последний последний вызов): файл "c:\Scripts\script.py", строка 2, в <module> pd.concat(pd.read_excel("Consumment_20221111_testdata.xlsx"‌​, NameError: name 'pd' is не определено. Возможно, Вы имели в виду: 'id'?

Ryan1234 23.11.2022 17:00

Я получил вышеуказанную ошибку, я не уверен, что мне не хватает?

Ryan1234 23.11.2022 17:00

Вам нужно поставить эту строку перед кодом: import pandas as pd

Timeless 23.11.2022 17:01

ну теперь я чувствую себя глупо!

Ryan1234 23.11.2022 17:10

Не волнуйся, мой друг, это случается со всеми нами. Удачного кодирования ;)

Timeless 23.11.2022 17:25

Другие вопросы по теме