为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千万里不及你 2021-06-11 17:09:02
我有一个数据框,它使用二进制指标来反映客户在特定月份是否在线。如果客户在线,则为 1,否则为 0。数据框如下所示:Customer    A   B   C   D   E   F   G   H   I   J11/30/2015  1   0   1   0   0   1   1   0   0   012/31/2015  0   1   0   1   0   1   1   0   0   11/31/2016   0   0   0   0   0   1   1   0   0   12/29/2016   1   1   1   1   1   1   0   1   1   13/31/2016   1   1   0   1   1   0   1   1   0   14/30/2016   0   1   1   1   0   1   1   1   0   15/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_Customers11/30/2015  1   0   1   0   0   1   1   0   0   0   412/31/2015  0   1   0   1   0   1   1   0   0   1   31/31/2016   0   0   0   0   0   1   1   0   0   1   02/29/2016   1   1   1   1   1   1   0   1   1   1   33/31/2016   1   1   0   1   1   0   1   1   0   1   04/30/2016   0   1   1   1   0   1   1   1   0   1   05/31/2016   1   1   1   1   1   1   0   1   0   1   0
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

通过定义自定义new函数并使用DataFrame.expanding. 我不确定为什么expanding().apply(new)需要从floatto转换的结果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


查看完整回答
反对 回复 2021-06-15
?
largeQ

TA贡献2039条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-06-15
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信