如何以不同的方式对多个列进行分组以查找新的匹配项?



我有以下这种格式的数据集:

bill_id patient_id Date_of_purchase
14           321      23-4-17
29           123      25-4-17
29           123      25-4-17
29           123      25-4-17
35           321      28-6-18
35           321      28-6-18

对于同一bill_id,购买行属于同一账单。
对于同一个patient_id,它对应同一个人。
Date是购买的日期。

我想做的是计算从任何开始日期到任何给定日期进行购买的新老客户的数量。如果该人的患者 ID 之前已经购买过,则算作旧。其余的都是新的。

是否有任何标准的 pandas 函数可以根据不同的条件对这样的多个列进行分组和比较?

类似于以下函数和输出:

foo(start_date, end_date):
return old customers, new customers.
## E.g. foo(19-4-17,30-6-19) is (1,1) as patient_id number 321 came twice and is hence counted as old.  

此代码片段独立运行,并使用一些分组和合并魔法:

import pandas as pd
from datetime import datetime
df = pd.DataFrame({"bill_id": [1, 1, 2, 3, 3], 
"patient_id": [1, 2, 3, 4, 4], 
"date": [datetime(2020, 1, 1), 
datetime(2020, 1, 2), 
datetime(2020, 1, 3), 
datetime(2020, 1, 4), 
datetime(2020, 1, 5)]
})
start_date = datetime(2020, 1, 2)
end_date = datetime(2020, 1, 5)
first_purchase = df.groupby(["patient_id"]).agg({"date": "min"})
first_purchase["first_purchase"] = 1
df = df.merge(first_purchase, how="left").fillna(0).astype({"first_purchase": "int"}).rename(columns={"first_purchase": "new_purchase"})
df["old_purchase"] = 1-df["new_purchase"]
idx = (df["date"]>=start_date)&(df["date"]<=end_date)
df.loc[idx, "new_purchase"].sum(), df.loc[idx, "old_purchase"].sum()

解释

我们首先按patient_id分组并获得最短日期(即患者首次购买的日期(。对于这些日期和patient_id,我们将"new_purchase"列设置为 true。"old_purchase"列正好相反。最后,我们按日期选择数据的子集,并对相应的列求和。

最新更新