You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas为每个Subject-ID补全1-6小时的测量记录?

补全患者小时数据的实现方法

这个需求用Pandas处理起来很直观,我给你分步拆解实现思路和代码:

核心思路

我们需要先为每个subject_id生成1到6小时的完整序列,再将这个完整序列和原始数据做左连接,这样就能保留已有记录的value,缺失的小时对应的value会自动填充为缺失值(后续你可以用缺失值处理技术处理)。

具体实现代码

1. 导入库并模拟输入数据

首先我们先还原你的输入示例:

import pandas as pd

# 模拟你的输入数据
input_data = {
    'subject_id': [2, 2, 2, 2, 3, 3],
    'hour': [1, 3, 5, 6, 4, 6],
    'value': [23, 15, 28, 11, 18, 22]
}
df = pd.DataFrame(input_data)

2. 生成完整的subject-hour组合

用MultiIndex.from_product生成所有subject_id和1-6小时的笛卡尔积,确保每个患者都覆盖全部6个小时:

# 生成所有subject_id + 1-6小时的完整组合
full_combinations = pd.MultiIndex.from_product(
    [df['subject_id'].unique(), range(1, 7)],  # range(1,7)对应1到6小时
    names=['subject_id', 'hour']
)
# 转成DataFrame格式
full_df = full_combinations.to_frame(index=False)

3. 左连接原始数据补全value

通过左连接,将原始数据中的value匹配到对应的subject-hour组合中,缺失的小时会自动填充为NaN(如果你需要显示为空字符串,可以额外处理):

# 左连接获取补全后的结果
result_df = pd.merge(full_df, df, on=['subject_id', 'hour'], how='left')

# 可选:将NaN转换为空字符串(和你给出的示例输出格式完全一致)
result_df['value'] = result_df['value'].fillna('')

4. 查看结果

运行print(result_df)就能得到你期望的输出:

subject_id  hour value
0           2     1    23
1           2     2      
2           2     3    15
3           2     4      
4           2     5    28
5           2     6    11
6           3     1      
7           3     2      
8           3     3      
9           3     4    18
10          3     5      
11          3     6    22

补充说明

  • 如果后续要用缺失值处理技术(比如插值、填充均值等),建议保留NaN而不是转成空字符串,因为Pandas的缺失值处理函数默认识别NaN。
  • 这个方法可以轻松扩展到更多小时数(比如1-24小时),只需要修改range(1,7)为对应的范围即可。

内容的提问来源于stack exchange,提问作者mayaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:29:14