每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 pandas 的单独列中

Posted

技术标签:

【中文标题】每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 pandas 的单独列中【英文标题】:Groupby count per category per month (Current month vs Remaining past months) in separate columns in pandas 【发布时间】:2021-07-24 02:23:15 【问题描述】:

假设我有以下数据框:

我正在尝试得到这样的东西。

我在想也许可以使用滚动功能,并为每种计数类型(当前月份和过去 3 个月)设置单独的数据框,然后根据 ID 合并它们。

我是 python 和 pandas 的新手,所以如果这是一个简单的问题,请多多包涵。我还在学习:)

编辑:

@furas 所以我开始计算所有计数的累积总和作为单独的列

 df['f_count_cum] = df.groupby(["ID"])['f_count'].transform(lambda x:x.expanding().sum())
    df['t_count_cum] = df.groupby(["ID"])['t_count'].transform(lambda x:x.expanding().sum())

然后通过

获取当前月份的df
df_current = df[df.index == (max(df.index)]
df_past_month = df[df.index == (max(df.index - 1)]

然后根据 ID 合并两个数据框?

我不确定它是否正确,但这是我的第一次尝试

【问题讨论】:

“月”列是日期还是字符串? 最好将您的输入和预期输出作为文本发布,以便人们可以复制粘贴并开始使用。请参考***.com/help/how-to-ask @00 "month" 列也是数据框的日期类型和索引 我刚刚修复了初始数据帧快照,因为我注意到它没有完整的四个月数据 你尝试了什么?你的代码在哪里?如果您将示例数据作为文本放入代码df = pd.DataFrame(....) 中会更好,因为这样我们就可以使用它来测试想法。 【参考方案1】:

对输入样本的一些假设:

    Month 索引是datetime64[ns] 类型。如果没有,请使用下面的数据类型进行类型转换。

    df['Month'] = pd.to_datetime(df.Month)

    Month 列是索引。如果没有,请将其设置为索引。

    df = df.set_index('Month')

    将 df 的上个月视为当前月份,将前 3 个月视为“过去 3 个月”。如果不分别修改df1和df2中的lastfirst函数。

代码

df1 = df.last('M').groupby('ID').sum().reset_index().rename(
    columns='f_count':'f_count(current month)',
            't_count':'t_count(current month)')
df2 = df.first('3M').groupby('ID').sum().reset_index().rename(
    columns='f_count':'f_count(past 3 months)',
            't_count':'t_count(past 3 months)')

df  = pd.merge(df1, df2, on='ID', how='inner').reindex(columns = [ 'ID',
    'f_count(current month)', 'f_count(past 3 months)',
    't_count(current month)','t_count(past 3 months)'
])

输出

    ID  f_count(current month)  f_count(past 3 months)  t_count(current month)  t_count(past 3 months)
0   A   3   13  8   14
1   B   3   5   7   5
2   C   1   3   2   4

相同代码的另一个版本,如果您更喜欢函数和单个语句

def get_df(freq):
    if freq=='M': 
        return df.last('M').groupby('ID').sum().reset_index()
    return df.first('3M').groupby('ID').sum().reset_index() 

df = pd.merge(get_df('M').rename(
    columns='f_count':'f_count(current month)',
         't_count':'t_count(current month)'),
        get_df('3M').rename(
   columns='f_count':'f_count(past 3 months)',
            't_count':'t_count(past 3 months)'),
        on='ID').reindex(columns = [ 'ID',
    'f_count(current month)', 'f_count(past 3 months)',
   't_count(current month)','t_count(past 3 months)'])

编辑:

从当前月份开始的前两个月:(我们可以根据需要使用 first 和 last 函数的不同组合)

df2 = df.last('3M').first('2M').groupby('ID').sum().reset_index().rename(
    columns='f_count':'f_count(past 3 months)',
            't_count':'t_count(past 3 months)')

【讨论】:

以上是关于每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 pandas 的单独列中的主要内容,如果未能解决你的问题,请参考以下文章

按时间范围确定的每月计数

用HIVESQL怎么获取上一个月的月份

如何使用 postgresql 将每月 26 日到下个月 25 日的数据分组?

mysql查询指定月份范围内,每个月的指定id下的数据量

如何使用月份名称获取最近 3 个月的计数,如果该月份没有记录需要使用月份名称获取 0 [重复]

Power BI:需要计算最近 3 个月的 MTD 销售额