繁体   English   中英

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

[英]Groupby count per category per month (Current month vs Remaining past months) in separate columns in pandas

假设我有以下 dataframe:

初始数据框

我试图得到这样的东西。

预期产出

我在想也许可以使用滚动 function 并为每种计数类型(当前月份和过去 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_current = df[df.index == (max(df.index)]
df_past_month = df[df.index == (max(df.index - 1)]

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

我不确定它是否正确,但这是我第一次接受这个

查看输入样本的几个假设:

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

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

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

    df = df.set_index('Month')

  3. 将 df 的最后一个月视为当前月份,将前 3 个月视为“过去 3 个月”。 如果不分别在 df1 和 df2 中相应地修改lastfirst function 。

代码

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)'
])

Output

    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

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

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)'])

编辑:

从当月开始的前两个月:(我们可以根据需要使用不同的首尾function组合)

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)'})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM