计算多列中两个日期之间的值的行数

问题描述 投票:0回答:1

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

我对其作为函数编写的位置进行了一些调整,并传递带有日期列表的数据帧,然后它返回一个数据帧,其中每一行都是列表中每个日期之间的漏斗计数。这可行,但我只是想知道,是否有一种更简单的方法而不是黑客方法?

python pandas dataframe data-analysis
1个回答
0
投票

问题是您在

&
之后计算布尔值和 (
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
© www.soinside.com 2019 - 2024. All rights reserved.