每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 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())
然后通过
获取当前月份的dfdf_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中的last
和first
函数。
代码
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 的单独列中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 postgresql 将每月 26 日到下个月 25 日的数据分组?