【问题标题】:Pandas cumulative countif (based on condition)Pandas 累计计数(根据条件)
【发布时间】:2021-07-12 13:18:24
【问题描述】:

我有一个 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个recovery_dates。

我试图避免使用 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()]

非常感谢!!

【问题讨论】:

  • 您的示例似乎不正确,所有recovery_date 都大于at,这与您的输出不匹配
  • @mozway。我认为 OP 忘了说当前的 at 是否大于之前的 recovery_date,因为它与输出匹配。我错了吗?
  • 很有可能。 OP 应该编辑问题以明确这一点。

标签: python pandas conditional-statements countif cumsum


【解决方案1】:

你正在寻找这样的东西:

df['result'] = df['at'].apply(lambda at: (at >= df['recovery_date']).sum())

它的作用是:对于at 列中的每个值,检查是否有任何大于或等于的recovery_dates(此时我们有一个 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

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 2020-06-13
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2020-05-08
    • 2020-09-30
    相关资源
    最近更新 更多