python - Pandas 累计计数(根据条件)
问题描述
我有一个 DataFrame df
,我试图根据列中的日期at
大于或等于列中的日期的条件计算累积计数recovery_date
。
这是原文df
:
at recovery_date
0 2020-02-01 2020-03-02
1 2020-03-01 2020-03-31
2 2020-04-01 2020-05-01
3 2020-05-01 2020-05-31
4 2020-06-01 2020-07-01
这是期望的结果:
at recovery_date result
0 2020-02-01 2020-03-02 0
1 2020-03-01 2020-03-31 0
2 2020-04-01 2020-05-01 2
3 2020-05-01 2020-05-31 3
4 2020-06-01 2020-07-01 4
解释是对于每个在它之前或在同一天at
有 x 数量的s。recovery_date
我试图避免使用 for 循环,因为我正在为时间敏感的应用程序实现它。
这是我能够找到的解决方案,但是我正在寻找性能更高的解决方案:
def how_many(at: pd.Timestamp, recoveries: pd.Series) -> int:
return (at >= recoveries).sum()
df["result"] = [how_many(row["at"], df["recovery_date"][:idx]) for idx, row in df.iterrows()]
非常感谢!!
解决方案
你正在寻找这样的东西:
df['result'] = df['at'].apply(lambda at: (at >= df['recovery_date']).sum())
它的作用是:对于at
列中的每个值,检查是否有任何recovery_date
大于或等于的 s(此时我们有一个由 True (=1) 和 False (=0) 值组成的数组)然后对它们求和。
这会产生您想要的输出
at recovery_date count result
0 2020-02-01 2020-03-02 1 0
1 2020-03-01 2020-03-31 1 0
2 2020-04-01 2020-05-01 1 2
3 2020-05-01 2020-05-31 1 3
4 2020-06-01 2020-07-01 1 4
推荐阅读
- python-3.x - 我们如何从生成器中保留 pandas 数据帧的索引?
- android - 切换 Fragments 时在 RecyclerView 中保存所选项目
- vue.js - 我应该如何正确使用 v-model 和 v-on:change 进行输入选择?
- javascript - 取消选中 reactjs 中的单选按钮
- python - 在 nltk 中为 python 编辑 Vader_lexicon.txt 以添加与我的域相关的单词
- python - 如果列表更改,Tkinter 的 OptionMenu 回调将不起作用
- python - 如何检测熊猫数据框中的混淆分类数据
- javascript - Ajax 获取内容后,我想调用另一个 ajax 函数
- javascript - 何时使用 Blob 类型从 API 获取图像?
- php - 使用 NGINX 对 PHP 脚本的多个同时请求