熊猫数据框,将3个列分组并计数第三个

时间:2018-10-14 21:07:18

标签: python python-3.x pandas pandas-groupby

我正在尝试按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 :(得分:1)

假设OG数据框中的列DatoTidVarenavn,请尝试以下操作:

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

...隐式假定时间戳记中的小时是开始时间。您可以重新索引并使用日期时间来获取所需的格式。

答案 1 :(得分:1)

这是另一种方法:

n = 5
average = 0
for i in range(n):
    numbers = eval(input('Please enter number ', (i+1) ,' of ', n ,' to average:',sep='',end=''))
    average = average+numbers/n

完整示例:

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)