首页 > 解决方案 > 如何计算两个日期之间的事件总和

问题描述

我有一个 DataFrame,我需要在其中计算每个人两个日期之间的事件数。

在下面的 DataFrame 中,对于每个 A 类日期,我需要计算每个人在上一个 A 类日期之前的 B 类日期数。每个人有多少个 A 型和 B 型日期没有限制。

我想避免 for 循环,因为它们很慢。

数据框

Person Date     Type 
1      01/01/19 A  
1      01/05/19 B 
1      02/01/19 A
1      03/01/19 A
2      01/01/19 A
2      01/07/19 B
2      01/25/19 B
2      02/01/19 A
2      02/05/19 B
2      04/01/19 A
3      03/01/19 A
3      04/01/19 A

期望的输出

Person Date   Count
1      2/1/19 1
1      3/1/19 0
2      2/2/19 2
2      4/1/19 1
3      4/1/19 0

标签: pythonpandas

解决方案


感谢 molybdenum42 的洞察力。我不知道差异。这让我对在类型 A 上过滤的索引上使用 diff 有了一个想法。我不知道如何在索引本身上执行此操作,所以我将它复制到另一列。数据框已经按人员和日期排序,但我将其包含在下面的代码中。

d = {"Person":[1,1,1,1,2,2,2,2,2,2,3,3],
     "Date":["01/01/19", "01/05/19", "02/01/19", "03/01/19", "01/01/19", "01/07/19", "01/25/19", 
             "02/01/19", "02/05/19", "04/01/19", "03/01/19", "04/01/19"],
     "Type":["A", "B", "A", "A", "A", "B", "B", "A", "B", "A", "A", "A"]}

df = pd.DataFrame(d)
df.Date = pd.to_datetime(df.Date)
df_sorted = df.sort_values(by=['Person', 'Date'])
df_sorted.reset_index(drop=True, inplace=True)
df_sorted['_index'] = df_sorted.index.values

group_a = df_sorted[df_sorted.Type == 'A'].groupby('Person')
df_sorted['Count'] = group_a['_index'].diff()-1
df_sorted[df_sorted.Count.notna()]

Person  Date    Type    _index  Count
1   02/01/19    A       2       1.0
1   03/01/19    A       3       0.0
2   02/01/19    A       7       2.0
2   04/01/19    A       9       1.0
3   04/01/19    A       11      0.0

推荐阅读