首页 > 解决方案 > 计算时间序列中首次二进制指标的数量

问题描述

我有一个数据框,它使用二进制指标来反映客户在特定月份是否在线。如果客户是在线的,则为 1,如果不是,则为 0。数据框如下所示:

Customer    A   B   C   D   E   F   G   H   I   J
11/30/2015  1   0   1   0   0   1   1   0   0   0
12/31/2015  0   1   0   1   0   1   1   0   0   1
1/31/2016   0   0   0   0   0   1   1   0   0   1
2/29/2016   1   1   1   1   1   1   0   1   1   1
3/31/2016   1   1   0   1   1   0   1   1   0   1
4/30/2016   0   1   1   1   0   1   1   1   0   1
5/31/2016   1   1   1   1   1   1   0   1   0   1

当客户首次上线时,他们会在特定月份获得 1。因此,当特定客户有他们的第一个 1 时,这就是他们“新”的月份。

我想在数据框的末尾添加一列,计算“新”客户的数量。

我认为最有效的方法是将第 0 行到第 i 行的值相加,并计算总和等于 1 的次数。当这个总和大于 1 时,客户将存活 2个月,并且在给定月份中不是新客户。

我已经使用这种方法在 excel 中计算了这个,但我不清楚如何在 Python 中解决这个问题。

生成的数据框如下所示:

Customer    A   B   C   D   E   F   G   H   I   J   New_Customers
11/30/2015  1   0   1   0   0   1   1   0   0   0   4
12/31/2015  0   1   0   1   0   1   1   0   0   1   3
1/31/2016   0   0   0   0   0   1   1   0   0   1   0
2/29/2016   1   1   1   1   1   1   0   1   1   1   3
3/31/2016   1   1   0   1   1   0   1   1   0   1   0
4/30/2016   0   1   1   1   0   1   1   1   0   1   0
5/31/2016   1   1   1   1   1   1   0   1   0   1   0

标签: pythonpandastime-series

解决方案


您可以应用一个累积最大值,它可以转发每列的“1”并对轴 1 中的所有列求和并计算差异。第一个值用 null 给出,您可以通过对第一行求和来填充

df1 = df[df.columns.difference(['Customer'])]
df['New_customers'] = df1.cummax().sum(1).diff().fillna(df1.loc[0].sum())

出去:

Customer    A   B   C   D   E   F   G   H   I   J   New_customers
0   11/30/2015  1   0   1   0   0   1   1   0   0   0   4.0
1   12/31/2015  0   1   0   1   0   1   1   0   0   1   3.0
2   1/31/2016   0   0   0   0   0   1   1   0   0   1   0.0
3   2/29/2016   1   1   1   1   1   1   0   1   1   1   3.0
4   3/31/2016   1   1   0   1   1   0   1   1   0   1   0.0
5   4/30/2016   0   1   1   1   0   1   1   1   0   1   0.0
6   5/31/2016   1   1   1   1   1   1   0   1   0   1   0.0

推荐阅读