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 для сброса индекса до значения по умолчанию. Старый индекс будет преобразован обратно в столбец.