Python 按国家/地区和设备分组的每月平均_订单

Python 按国家/地区和设备分组的每月平均_订单,python,pandas,Python,Pandas,我想计算 每月平均订单按设备和国家分组 平均每月订单数基于给定月份的平均每日订单数 主表 date country device count_orders 2019-01-01 UK phone 100 2019-01-02 UK tablet 200 2019-01-03 UK phone 200 2019-01-04 UK phone 300 2019-01-05 UK tabl

我想计算

  • 每月平均订单设备国家分组

  • 平均每月订单数基于给定月份的平均每日订单数

主表

date        country  device  count_orders
2019-01-01  UK       phone    100
2019-01-02  UK       tablet   200
2019-01-03  UK       phone    200
2019-01-04  UK       phone    300
2019-01-05  UK       tablet   400
2019-01-06  UK       phone    400

2019-01-01  JP       phone    200
2019-01-02  JP       tablet   100
2019-01-03  JP       phone    100
2019-01-04  JP       phone    500
2019-01-05  JP       tablet   300
2019-01-06  JP       phone    300


输出表

month       country  device  average_monthly_orders
January-19  UK       phone   32 
January-19  UK       tablet  19 
January-19  JP       phone   35
January-19  JP       tabet   13

根据您提供的数据:

df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.strftime('%B-%y')
df = df.groupby(by=['month', 'country', 'device'], as_index=False).mean().rename(columns={'count_orders': 'average_monthly_orders'})
print(df)

        month country  device  count_orders
0  January-19      JP   phone           275
1  January-19      JP  tablet           200
2  January-19      UK   phone           250
3  January-19      UK  tablet           300

如果希望将每月平均订单存储在输出表中,则需要创建四个单独的每月平均订单变量,每组一个。然后,遍历所有数据,根据主表其他列中的信息,只对给定的月平均值作出贡献

使用,将
日期
列转换为熊猫日期时间序列,然后使用对
月份
国家
设备
上的数据帧进行分组,现在使用
总和
在分组的数据帧中聚合
计数
。现在,使用将新数据框中的
平均每月\u订单
列除以当月相应的天数,可使用以下方法获得:



一个月的平均值是多少32?是的,当然:)我想这可能更容易理解read@user12625679这回答了你的问题吗?谢谢@jezrael很高兴收到你的来信:)。
df['date'] = pd.to_datetime(df['date'])
df1 = (
    df.groupby([df['date'].dt.strftime('%B-%y'), 'country', 'device'], sort=False)
    .agg(average_monthly_orders=('count_orders', 'sum'))
    .reset_index()
)

df1['average_monthly_orders'] = (
    df1['average_monthly_orders'].floordiv(pd.to_datetime(
        df1['date'], format='%B-%y').dt.daysinmonth)
)
# print(df1)
         date country  device  average_monthly_orders
0  January-19      UK   phone                      32
1  January-19      UK  tablet                      19
2  January-19      JP   phone                      35
3  January-19      JP  tablet                      12