Pandas 累计countif(根据条件)

Pandas cumulative countif (based on condition)

我有一个 DataFrame df,我正在尝试根据 at 列中的日期大于或等于 [=] 列中的日期这一条件来计算累计计数17=].

原文如下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 个 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 大于或等于(此时我们有一个 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