计算时间序列中第一次二进制指示符的数目

2024-04-25 01:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框架,它使用二进制指标来反映客户在特定月份是否处于活动状态。如果客户是活动的,则有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,这是一个月,他们是“新的”。你知道吗

我想在dataframe的末尾添加一个列来统计“新”客户的数量。你知道吗

我认为最有效的方法是将第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

Tags: 数据方法框架dataframe数量客户二进制customer
2条回答

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

通过定义自定义new函数并使用DataFrame.expanding。我不知道为什么expanding().apply(new)的结果需要从floatint进行强制转换,但是,嘿,它是有效的:

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

相关问题 更多 >