![](/img/trans.png)
[英]How to print remaining months from current month of a year in python 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合并两个数据框?
我不确定它是否正确,但这是我第一次接受这个
查看输入样本的几个假设:
Month
索引是datetime64[ns]
类型。 如果没有,请使用下面的类型转换数据类型。
df['Month'] = pd.to_datetime(df.Month)
Month
列是索引。 如果没有,请将其设置为索引。
df = df.set_index('Month')
将 df 的最后一个月视为当前月份,将前 3 个月视为“过去 3 个月”。 如果不分别在 df1 和 df2 中相应地修改last
和first
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.