Pandas如何按列条件提取行:从NEW状态到PAID状态停止并计算耗时
实现方案
步骤1:数据预处理
首先统一列名,将日期列转换为datetime格式方便后续计算时长:
import pandas as pd # 假设原始数据已读入df,先调整列名 df.columns = ['Date', 'Status', 'Client'] # 转换日期格式 df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
步骤2:过滤符合要求的行
按照示例规则,过滤逻辑为:按客户分组后,忽略CANCELLED记录及关联的无效PAID记录,仅保留连续NEW状态后紧接的对应PAID记录:
# 存储符合要求的行索引 keep_idx = [] for client, group in df.groupby('Client', sort=False): group = group.sort_values('Date').reset_index() valid_new_start = None for idx, row in group.iterrows(): if row['Status'] == 'NEW': if valid_new_start is None: valid_new_start = idx keep_idx.append(row['index']) elif row['Status'] == 'PAID': if valid_new_start is not None: keep_idx.append(row['index']) valid_new_start = None # 遇到CANCELLED重置当前有效NEW序列 elif row['Status'] == 'CANCELLED': valid_new_start = None # 得到过滤后的df df_filtered = df.loc[keep_idx].reset_index(drop=True)
此时得到的df_filtered就是你需要的筛选后结果表。
步骤3:统计NEW到PAID的时长
对过滤后的数据按客户分组,统计每个NEW到PAID周期的时长:
res = [] for client, group in df_filtered.groupby('Client', sort=False): group = group.sort_values('Date').reset_index(drop=True) i = 0 while i < len(group): if group.loc[i, 'Status'] == 'NEW': # 找到当前NEW序列的起始日期 start_date = group.loc[i, 'Date'] # 找到对应PAID的位置 while i < len(group) and group.loc[i, 'Status'] == 'NEW': i += 1 if i < len(group) and group.loc[i, 'Status'] == 'PAID': end_date = group.loc[i, 'Date'] days = (end_date - start_date).days res.append({'Client': client, 'NEW日期': start_date, 'PAID日期': end_date, '间隔天数': days}) i += 1 # 转为DataFrame df_duration = pd.DataFrame(res)
如果需要统计每个客户的平均转化时长,可再对df_duration按Client字段聚合求平均值即可。
内容的提问来源于stack exchange,提问作者Satish G
相关产品推荐
相关产品推荐

