【问题标题】:Summarizing data from last 12 months in dataframe by category using python使用python按类别汇总数据框中过去12个月的数据
【发布时间】:2018-06-06 19:36:48
【问题描述】:

我正在尝试按类别创建过去 12 个月(不包括当月)的数据摘要。我用下面的代码总结了前3个月,但是这样做了12个月似乎很麻烦。我想知道在过去 12 个月中是否有更有效的动态切片数据的方法。 df1 是我使用 SQL 查询从数据库连接加载的完整数据集。我使用 .drop() 来切掉不需要的数据列,只留下计数。

import pandas as pd
import datetime

df1.Start_Date = pd.DatetimeIndex(df1.Start_Date)

today = datetime.date.today()
currentfirst = today.replace(day=1)
thirdMonth = currentfirst - pd.offsets.MonthBegin(3)
secondMonth = currentfirst - pd.offsets.MonthBegin(2)
firstMonth = currentfirst - pd.offsets.MonthBegin(1)

fst_label = firstMonth.strftime('%B')
snd_label = secondMonth.strftime('%B')
thd_label = thirdMonth.strftime('%B')

def monthly_vol(df, label, start_date, end_date):
    """Slices df1 into previous months and sums the volume of each change class."""
    if start_date is not None:
        df = df1[df1.Start_Date >= start_date]
    if end_date is not None:
        df = df[df.Start_Date < end_date]
    df_count = df.groupby('Change Class').count().drop(['Start_Date', 'Risk Level', 'Change Coordinator', 'Change Coordinator Group'], axis=1)
    return df_count

fst_month = monthly_vol(df1, fst_label, firstMonth, currentfirst)
snd_month = monthly_vol(df1, snd_label, secondMonth, firstMonth)
thd_month = monthly_vol(df1, thd_label, thirdMonth, secondMonth)

def month_merge(df1, df2, df3):
    """Merges monthly dataframes together."""
    new_df = pd.merge(df1, df2, left_index=True, right_index=True).merge(df3, left_index=True, right_index=True)
    new_df.columns = [fst_label, snd_label, thd_label]
    print(new_df)
    return new_df

monthly_vol = month_merge(fst_month, snd_month, thd_month)

这将给出输出:

              May  April  March
Change Class                   
Emergency      36     36     32
Expedited      17     24     35
Normal        182    146    134
Standard      256    210    267

奖金问题: 在同一数据框中获得每个类别的总体积平均值会很好。有点像这样:

              May  MayAVG  April  AprilAVG   March  MarchAVG
Change Class                   
Emergency      36   7.33   36     8.65       32     6.84
Expedited      17   3.46   24     5.77       35     7.48
Normal        182   37.07  146    35.10      134    28.63
Standard      256   52.14  10     50.48      267    57.05

任何帮助将不胜感激!

【问题讨论】:

  • 您的问题是什么?还提供minimal reproducible example 而不是整个程序。您可以提供输入数据、预期输出和为您提供当前输出的最少代码。
  • datetime 具有可让您轻松计算月份的属性。 IE。 df.date_col.dt.month 会给你一个月。您可以按此分组并轻松计算平均值、总计、大小等内容。等
  • 我的问题是'编译与上述类似的输出的最佳方法是什么,而不是为每个月创建一个 firstMonth = currentfirst - pd.offsets.MonthBegin(1) 变量并将其传递给函数。

标签: python pandas date datetime group-by


【解决方案1】:

您为什么不尝试使用 Dictionary ?字典是数据的键值对。 例如:{“3”:“三月”,“4”:“四月”}。 因此,无论您在哪里维护一对,都可以使用字典。 在循环中填充这些字典。 见下文。

month_dict = {"3": "March", "2": "April", "1": "May"} 

thirdMonth = currentfirst - pd.offsets.MonthBegin(3)
secondMonth = currentfirst - pd.offsets.MonthBegin(2)
firstMonth = currentfirst - pd.offsets.MonthBegin(1)


label_dict = {}

fst_label = firstMonth.strftime('%B')
snd_label = secondMonth.strftime('%B')
thd_label = thirdMonth.strftime('%B')

vol_month = {}

fst_month = monthly_vol(df1, fst_label, firstMonth, currentfirst)
snd_month = monthly_vol(df1, snd_label, secondMonth, firstMonth)
thd_month = monthly_vol(df1, thd_label, thirdMonth, secondMonth)

【讨论】:

  • 我运行脚本时,firstMonth 变量每个月都会发生变化,即现在的第一个月是 5 月,但下个月将是 6 月。
  • 它不会改变逻辑。每次运行脚本时,即每月填充月份字典。月份字典不是硬编码的。我只是举了一个例子来展示它的样子。
  • 字典如何与pd.offsets.MonthBegin()交互?这些生成的日期时间比 currentfirst 变量早 1、2 或 3 个月。
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 2019-07-10
  • 2021-07-04
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多