扩展DataFrame生成嵌套分组玩具数据集:按条件新增个体观测
我来帮你搞定这个玩具数据集的扩展任务!下面是用Python pandas实现的完整方案,完全贴合你的需求:
实现思路
- 针对每个个体,根据
baseline字段的值生成对应数量的基线观测记录,日期从baselineStart往前递推(比如baseline=4时,包含baselineStart当天及之前3天,共4条记录) - 根据
postBaseline字段的值生成基线后观测记录,最多生成20条,日期从baselineStart次日开始递推 - 每条观测记录都保留个体、组的关联信息,并标记观测类型(baseline/postBaseline)
完整代码实现
import pandas as pd from datetime import timedelta # 初始化你提供的数据集(补全了第11条的postBaseline值) initial_data = pd.DataFrame({ 'person': [1,2,3,4,5,6,7,8,9,10,11], 'group': [1,1,1,1,2,2,2,2,3,3,3], 'baseline': [4,6,4,6,4,6,4,6,4,6,4], 'baselineStart': pd.to_datetime(['2018-06-04']*4 + ['2018-07-02']*4 + ['2018-07-30']*3), 'postBaseline': [20]*11 }) def expand_individual(row): # 生成基线观测记录:从baselineStart往前推,生成baseline条日期 baseline_dates = [row['baselineStart'] - timedelta(days=i) for i in range(row['baseline']-1, -1, -1)] baseline_records = pd.DataFrame({ 'person': row['person'], 'group': row['group'], 'observation_date': baseline_dates, 'observation_type': 'baseline' }) # 生成基线后观测记录:最多20条,从baselineStart次日开始 max_post = min(row['postBaseline'], 20) post_dates = [row['baselineStart'] + timedelta(days=i+1) for i in range(max_post)] post_records = pd.DataFrame({ 'person': row['person'], 'group': row['group'], 'observation_date': post_dates, 'observation_type': 'postBaseline' }) # 合并当前个体的所有观测记录 return pd.concat([baseline_records, post_records], ignore_index=True) # 应用函数扩展所有个体的记录 expanded_data = pd.concat([expand_individual(row) for _, row in initial_data.iterrows()], ignore_index=True) # 查看扩展后的数据集示例(以第一个个体为例) print(expanded_data[expanded_data['person'] == 1].head(10))
代码关键点说明
- 日期生成逻辑:基线观测从
baselineStart往前数,确保包含当天;基线后观测从次日开始,严格控制最多20条 - 嵌套结构保留:每条记录都绑定了对应的
person和group字段,完美维持个体嵌套于组内的关系 - 灵活性:如果后续
postBaseline字段出现小于20的值,代码会自动适配生成对应数量的记录
输出示例(第一个个体的前10条记录)
person group observation_date observation_type 0 1 1 2018-06-01 baseline 1 1 1 2018-06-02 baseline 2 1 1 2018-06-03 baseline 3 1 1 2018-06-04 baseline 4 1 1 2018-06-05 postBaseline 5 1 1 2018-06-06 postBaseline 6 1 1 2018-06-07 postBaseline 7 1 1 2018-06-08 postBaseline 8 1 1 2018-06-09 postBaseline 9 1 1 2018-06-10 postBaseline
内容的提问来源于stack exchange,提问作者Eric Green
相关产品推荐
相关产品推荐

