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 时,这就是他们“新”的月份。
我想在数据框的末尾添加一列,计算“新”客户的数量。
我认为最有效的方法是将第 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())
出去:
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
推荐阅读
- php - PHP中的多维JSON数组?
- model-view-controller - 在 godaddy plesk 文件 io 错误上运行 MVC 项目
- python - 服务器在 python django 中的 http://127.0.0.1:8000/admin/ 停止
- anylogic - 获取系统时间并转换为字符串
- java - 如何在此 JSONArray 的“语言”属性下获取“名称”?
- python - document 必须是 dict、bson.son.SON、bson.raw_bson.RawBSONDocument 或继承自 collections.MutableMapping 的类型的实例
- css - CSS 和 JS 在 cakephp 2.2.6 中无法通过 HTTPS 工作
- ruby-on-rails - 为什么 rails html_safe 方法会改变我的 html 结构?
- javascript - 虚拟主机:SSD 与 HDD 动画速度
- mysql - 如何找到每个部门的第 5 高薪水?