我有一个 DataFrame,其中的列是流程中的阶段,每行都有该记录进入每个“阶段”的日期。我想计算每一列中日期在特定范围内的行数。然后,最终目标是绘制看起来像漏斗的东西以查看阶段之间的下降情况,并比较日期范围之间的漏斗。下面是一个示例表。
第一阶段 | 第二阶段 | 第三阶段 | |
---|---|---|---|
第 1 行 | 2023 年 1 月 3 日 | 2023 年 4 月 3 日 | 2023 年 5 月 7 日 |
第 2 行 | 2023 年 2 月 5 日 | 2023 年 2 月 6 日 | 2023 年 3 月 4 日 |
第3行 | 2023 年 1 月 15 日 | 2023 年 6 月 3 日 | 2023 年 7 月 8 日 |
起初,我的方法是仅选择日期范围内的所有行,例如:
start = pd.to_datetime('2023-1-1')
end = pd.to_datetime('2023-3-30')
df[(df[list_of_cols] >= start).any(axis=1)) & (df[list_of_columns] <= end).any(axis=1))]
df[list_of_cols].count()
但在上面的示例中,即使阶段 2 和 3 发生在日期范围之外,也会返回并计算所有 3 个阶段中的第 3 行。
所以我现在的代码是
# make a dict with the count in each column
start = pd.to_datetime('2023-1-1')
end = pd.to_datetime('2023-3-30')
date_range = pd.date_range(start, end)
df_dict = {f'{start}-{end}':[]}
# append the count into its' row's list
for col in list_of_cols:
df_dict[f'{start} - {end}'].append(df[col].isin(date_range).sum())
pd.DataFrame.from_dict(df_dict, orient='index', columns=fun_cols)
我对其作为函数编写的位置进行了一些调整,并传递带有日期列表的数据帧,然后它返回一个数据帧,其中每一行都是列表中每个日期之间的漏斗计数。这可行,但我只是想知道,是否有一种更简单的方法而不是黑客方法?
问题是您在
&
之后计算布尔值和 (any
)。
您应该首先检查所有日期是否在开始和结束之间,然后聚合:
start = pd.to_datetime('2023-1-1')
end = pd.to_datetime('2023-3-30')
tmp = df.apply(pd.to_datetime)
df['count'] = (tmp.ge(start) & tmp.le(end)).sum(axis=1)
输出:
stage 1 stage 2 stage 3 count
row 1 1/3/2023 4/3/2023 5/7/2023 1
row 2 2/5/2023 2/6/2023 3/4/2023 3
row 3 1/15/2023 6/3/2023 7/8/2023 1