Я пытаюсь сгруппировать фрейм данных по 3 столбцам, дате, времени и статье, и вернуть объект, в котором у меня есть группы по дате, времени и статье, а также количество каждой статьи за время (час).
Этот код справляется с группировкой, но я не могу понять, как также получить счетчик:
dfs.groupby([dfs['Dato'].dt.date,dfs['Tid'].dt.hour,dfs['Varenavn']])
так что это может быть мой вклад:
01.01.2018 0901 Car
01.01.2018 0905 Car
01.01.2018 0945 Horse
01.01.2018 1005 Car
02.01.2018 0900 Horse
02.01.2018 0915 Horse
02.01.2018 1050 Car
02.01.2018 1055 Horse
Требуемый выход:
01.01.2018 09-10 Car 2
Horse 1
01.01.2018 10-11 Car 1
02.01.2018 09-10 Horse 2
02.01.2018 10-11 Car 1
Horse 1
Моя общая цель - узнать, сколько предметов было продано в час в день, из кадра данных, содержащего каждый проданный товар, в какое время и на какую дату
Вот еще один подход:
df['datetime'] = pd.to_datetime(df['date'] + df['time'].astype(str), format='%m.%d.%Y%H%M')
grouper = df.datetime.dt.strftime('%m.%d.%Y %H-') + (df.datetime.dt.hour+1).astype(str)
dfout = df.groupby(grouper)['article'].value_counts().to_frame('count')
Полный пример:
import pandas as pd
data = '''\
date time article
01.01.2018 901 Car
01.01.2018 905 Car
01.01.2018 945 Horse
01.01.2018 1005 Car
02.01.2018 900 Horse
02.01.2018 915 Horse
02.01.2018 1050 Car
02.01.2018 1055 Horse'''
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+')
df['datetime'] = pd.to_datetime(df['date'] + df['time'].astype(str), format='%m.%d.%Y%H%M')
grouper = df.datetime.dt.strftime('%m.%d.%Y %H-') + (df.datetime.dt.hour+1).astype(str)
dfout = df.groupby(grouper)['article'].value_counts().to_frame('count')
print(dfout)
Возвращает:
count
datetime article
01.01.2018 09-10 Car 2
Horse 1
01.01.2018 10-11 Car 1
02.01.2018 09-10 Horse 2
02.01.2018 10-11 Car 1
Horse 1
Предполагая, что столбцы Dato
, Tid
и Varenavn
в вашем Varenavn
OG, попробуйте следующее:
df['datetime'] = df['Dato'] + str(' ') + df['Tid']
df['datetime'] = pd.to_datetime(df['datetime'], format = '%m.%d.%Y %H%M')
df.groupby([pd.Grouper(key = 'datetime', freq = 'H'), 'Varenavn'])['Varenavn'].count()
ВЫХОД:
datetime Varenavn
2018-01-01 09:00:00 Car 2
Horse 1
2018-01-01 10:00:00 Car 1
2018-02-01 09:00:00 Horse 2
2018-02-01 10:00:00 Car 1
Horse 1
... неявно предполагая, что час в метке времени - это время начала. Вы можете переиндексировать и играть с датой, чтобы получить нужный формат.