Pandas dataframe, группирующий 3 столбца и считающий третий

1

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

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

Теги:
pandas
python-3.x
pandas-groupby

2 ответа

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
  • 0
    Спасибо! это сработало, но мне пришлось добавить .astype (str) к df ['date'], чтобы оно заработало.
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

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

  • 0
    Это сработало, спасибо большое :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню