【问题标题】:Pandas dataframe, grouping 3 columns and counting the thirdPandas 数据框,将 3 列分组并计算第三列
【发布时间】:2019-07-14 05:06:15
【问题描述】:

我正在尝试按 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

我的总体目标是从包含每件售出商品的数据框中找出每天每小时售出多少件商品,在什么时间和什么日期售出

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 谢谢!这行得通,但我必须将 .astype(str) 添加到 df['date'] 才能使其工作。
    【解决方案2】:

    假设您的 OG 数据框中的列 Dato、Tid 和 Varenavn,试试这个:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2022-11-12
      • 2022-07-06
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多