基于Age区间计算下一次Breaking变更的time_diff_new平均时长
基于Age区间计算到下一次Breaking的平均天数
实现步骤
- 数据预处理:将字符串类型的'Nan'替换为真实的NaN,便于后续逻辑判断;
- 划分Age区间:根据业务需求定义Age的分组区间,用
pd.cut生成区间标签; - 获取下一次Breaking的时间:利用反向填充(
bfill)为每条记录匹配后续最近的Breaking事件时间; - 计算天数差并过滤有效数据:仅保留非Breaking且存在后续Breaking事件的记录,计算当前时间到下一次Breaking的天数差;
- 分组求平均:按Age区间分组,计算每个区间内的平均等待天数。
完整代码实现
import pandas as pd import numpy as np # 1. 构建并预处理原始DataFrame data = [{'Year': 2019, 'time_diff_new': 0, 'type1': 'Nan', 'Age': 861}, {'Year': 2019, 'time_diff_new': 100, 'type1': 'Nan', 'Age': 861}, {'Year': 2019, 'time_diff_new': 105, 'type1': 'Nan', 'Age': 861}, {'Year': 2019, 'time_diff_new': 113, 'type1': 'Breaking', 'Age': 861}, {'Year': 2019, 'time_diff_new': 127, 'type1': 'Breaking', 'Age': 861}, {'Year': 2020, 'time_diff_new': 299, 'type1': 'Breaking', 'Age': 861}, {'Year': 2020, 'time_diff_new': 462, 'type1': 'Nan', 'Age': 861}, {'Year': 2021, 'time_diff_new': 601, 'type1': 'Breaking', 'Age': 861}, {'Year': 2021, 'time_diff_new': 605, 'type1': 'Nan', 'Age': 861}, {'Year': 2021, 'time_diff_new': 771, 'type1': 'Breaking', 'Age': 861}, {'Year': 2021, 'time_diff_new': 855, 'type1': 'Nan', 'Age': 861}, {'Year': 2021, 'time_diff_new': 861, 'type1': 'Nan', 'Age': 861}] df = pd.DataFrame(data) df['type1'] = df['type1'].replace('Nan', np.nan) # 2. 定义Age区间(可根据业务需求修改) age_bins = [800, 850, 900] age_labels = ['800-849', '850-899'] df['Age_Interval'] = pd.cut(df['Age'], bins=age_bins, labels=age_labels, right=False) # 3. 获取每条记录后续最近的Breaking时间 df['next_breaking_time'] = df.loc[df['type1'] == 'Breaking', 'time_diff_new'].bfill() # 4. 计算天数差并过滤有效数据 df['days_to_next_breaking'] = df['next_breaking_time'] - df['time_diff_new'] valid_df = df[(df['type1'] != 'Breaking') & (~df['next_breaking_time'].isna())] # 5. 按Age区间分组计算平均天数 result = valid_df.groupby('Age_Interval')['days_to_next_breaking'].mean().reset_index() print(result)
结果说明
针对示例数据,所有记录的Age均为861,会被划分到850-899区间,计算得到的平均等待天数为87.8。
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

