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