Pandas dataframe, группирующий 3 столбца и считающий третий - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь сгруппировать фрейм данных по 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

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

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вот другой подход:

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
0 голосов
/ 15 октября 2018

Предполагая, что столбцы Dato, Tid и 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...