计算时间序列中的首次二进制指标数量

时间:2018-09-11 10:28:03

标签: python pandas time-series

我有一个数据框,该框使用二进制指标来反映客户在特定月份内是否还活着。如果客户是有生命的,则为1,否则为0。数据帧如下所示:

ax[1, 1].tick_params(which="both", bottom=True)

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

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

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

我已经使用这种方法在excel中进行了计算,但是不清楚如何在Python中进行此操作。

结果数据框如下所示:

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

2 个答案:

答案 0 :(得分:1)

您可以应用一个累积最大值,该最大值可以转发每列的“ 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

答案 1 :(得分:1)

通过定义自定义new函数并使用DataFrame.expanding。我不确定为什么expanding().apply(new)的结果需要从float强制转换为int,但是嘿,它的工作原理是

def new(column):
    return column[-1] and not any(column[:-1])

result = df.expanding().apply(new).sum(axis=1).astype(int)

print(result)

Out:
11/30/2015    4
12/31/2015    3
1/31/2016     0
2/29/2016     3
3/31/2016     0
4/30/2016     0
5/31/2016     0
dtype: int32