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