我有一个数据框架,其中记录了2011年至2018年的数据。其中一列包含drop_off_date,这是客户离开奖励计划的日期。我想计算2011年至2018年之间每个月有多少人下降。因此,对于84个月的时间段,我需要使用drop_off_date列的下班人数。
我将列更改为日期时间,我知道我可以使用.agg和.count方法,但是我不确定如何每月进行计数。老实说,我不知道下一步将是什么。
数据示例:
Record ID | store ID | drop_off_date
a1274c212| 12876| 2011-01-27
a1534c543| 12877| 2011-02-23
a1232c952| 12877| 2018-12-02
结果应如下所示:
Month: | #of dropoffs:
Jan 2011 | 15
........
Dec 2018 | 6
答案 0 :(得分:1)
使用数据
我假设您的日期已强制转换为datetime值,并使用errors='coerce'
处理异常值。
然后您应该从中删除所有不适用项,以便仅与放弃的客户打交道。
您可以通过多种方式执行此操作,我将执行简单的df.dropna(subset=['drop_off_date'])
print(df)
Record ID store ID drop_off_date
0 a1274c212 12876 2011-01-27
1 a1534c543 12877 2011-02-23
2 a1232c952 12877 2018-12-02
让我们创建一个月份列以用作汇总
df['Month'] = df['drop_off_date'].dt.strftime('%b')
然后我们可以对记录ID进行简单的分组依据作为计数。 (假设您只想计算唯一ID)?
df1 = df.groupby(df['Month'])['Record ID'].count().reset_index()
print(df1)
Month Record ID
0 Dec 1
1 Feb 1
2 Jan 1
编辑:要占几年。
首先让我们创建一个年度助手列
df['Year'] = df['drop_off_date'].dt.year
df1 = df.groupby(['Month','Year' ])['Record ID'].count().reset_index()
print(df)
Month Year Record ID
0 Dec 2018 1
1 Feb 2011 1
2 Jan 2011 1
答案 1 :(得分:1)
我建议直接使用drop_off_ym列中的字符串并将其剥离以仅保留年份和月份:
df['drop_off_ym'] = df.drop_off_date.apply(lambda x: x[:-3])
然后将groupby应用于新创建的列,然后再应用count():
df_counts_by_month = df.groupby('drop_off_ym')['StoreId'].count()