首页 > 解决方案 > 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()]

非常感谢!!

标签: pythonpandasconditional-statementscountifcumsum

解决方案


你正在寻找这样的东西:

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

推荐阅读