Pandas Dataframe GroupBy, как получить значение, по которому все сгруппировано?

python #pandas #dataframe #pandas-groupby

#python #pandas #dataframe #pandas-groupby

Вопрос:

Приношу свои извинения за заголовок, я не могу придумать лучшего. У меня есть csv-файлы, которые я считываю в dataframe. Этот CSV отслеживает все время, когда машина была включена, и регистрирует это время. Я преобразую время в временную метку, а затем использую df.groupby() для подсчета всех событий в течение часа. Данные выглядят так внутри фрейма данных:

                          Machines Used per Hour  Revenue per Hour
Timestamp                                                    
2021-08-22 06:00:00                       4             14.00
2021-08-22 08:00:00                       1              4.25
2021-08-22 09:00:00                       8             32.75
2021-08-22 10:00:00                      14             63.75
 

Проблема, с которой я сталкиваюсь, заключается в том, что я могу получить данные для машин, используемых в час, и доход в час, но я не могу получить временную метку. Я хотел бы ввести в свою базу данных временную метку в том виде, в каком она отображается в dataframe, но это не фактический столбец, и я не могу найти способ получить его сам по себе. Вот мой код:

  df = wr.s3.read_csv(path=[f's3://{csvList[i].bucket_name}/{csvList[i].key}'])
 df['Timestamp'] = pd.to_datetime(df['Timestamp'])
 hourlyMachineUseCount = (df.groupby(df['Timestamp'].dt.floor('h'))['Machine Name'].count()) # Sorts by day, counting amount of machines used per hour
 totalHourlyRevenue = (df.groupby(df['Timestamp'].dt.floor('h'))['Total Revenue'].sum()) # Gives back the total revenue per hour per day 
 hours = (df.groupby(df['Timestamp'].dt.floor('h'))['Timestamp']) 

 machineAndRevenuePerHourDF = pd.DataFrame()
 machineAndRevenuePerHourDF['Machines Used per Hour'] = hourlyMachineUseCount
 machineAndRevenuePerHourDF['Revenue per Hour'] = totalHourlyRevenue
 machineAndRevenuePerHourDF['Timestamp'] = hours
 

Переменная hours — это то, где я сейчас застрял. Сейчас он настроен так, что в моем новом столбце временных меток dataframes будет отображаться каждое событие в течение часа.

    2021-08-22 06:07:21
   2021-08-22 06:37:41
   2021-08-22 06:39:45
   2021-08-22 06:41:28
 

Я хочу, чтобы это выглядело так 2021-08-22 06:00:00

Ответ №1:

Вместо вычисления отдельных переменных и создания новой DataFrame вы можете использовать agg метод:

 df = df.groupby(df['Timestamp'].dt.floor('h')).agg(
    machines_used_per_hour=('Machine Name', 'count'),
    revenue_per_hour=('Total Revenue', 'sum')
).reset_index()
 

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

1. Это работает отлично, затем я вставил его в свой оператор SQL Insert в виде строки, и он отображается в моей базе данных. Большое вам спасибо. Если вы готовы, я хотел бы услышать об этом agg методе вашими словами, я собираюсь узнать об этом подробнее в ближайшее время.

2. Рад, что это сработало. Крис Моффитт обычно хорошо объясняет: полное руководство по группировке и агрегированию с помощью Pandas

Ответ №2:

Когда вы выполняете a DataFrame.goupby() , результирующий фрейм данных будет иметь by аргумент в качестве индекса (здесь временная метка).

Вы можете использовать DataFrame.reset_index() after вашего groupby для сброса индекса до значения по умолчанию. Старый индекс будет преобразован обратно в столбец.