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

Python 时间序列中第一次二进制指示符的计数,python,pandas,time-series,Python,Pandas,Time Series,我有一个数据框架,它使用二进制指标来反映客户在某个特定月份是否处于活动状态。如果客户处于活动状态,则存在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

我有一个数据框架,它使用二进制指标来反映客户在某个特定月份是否处于活动状态。如果客户处于活动状态,则存在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

您可以应用一个累计最大值,该值可以向前移动每列的“1”,并对轴1中的所有列求和,然后计算差值。 第一个值为null,可以通过对第一行求和来填充

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


通过定义自定义的
新的
函数并使用
数据帧。展开
。我不知道为什么
expansing().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

如果客户在第二个月上线,他们也会得到
1
。换句话说,您是否只计算每个客户的第一个
1
。。。你能解释一下这行的作用吗:返回列[-1]而不是任何列(列[:-1])我一直在试图理解,但不能完全理解以下内容:1。运行
帮助(任意)
,2。对列[:-1]中的对象运行
:打印(对象)
,3。运行
print(bool(0))
print(bool(1))
。让我知道这是否有帮助。
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