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

如何按指定条件将宽DataFrame转为长DataFrame并新增统计列

解决方案

完整实现代码

import pandas as pd
import numpy as np

# 加载示例数据
NaN = np.nan
data = {'ID':['A','A','A','A','A','A','A','A','A','C','C','C','C','C','C','C','C'],
    'Week': ['Week1','Week1','Week1','Week1','Week2','Week2','Week2','Week2','Week3',
             'Week1','Week1','Week1','Week1','Week2','Week2','Week2','Week2'],
    'Risk':['High','','','','','','','','','High','','','','','','',''],
    'Testing':[NaN,'Pos',NaN,'Neg',NaN,NaN,NaN,NaN,'Pos', NaN, 
              NaN,NaN,'Negative',NaN,NaN,NaN,'Positive'],
    'Week1_adher':['Yes',NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,'No',NaN,NaN,NaN,NaN,NaN,NaN,NaN],
    'Week2_adher':['No',NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,'No',NaN,NaN,NaN,NaN,NaN,NaN,NaN],
    'Week3_adher':['No',NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,'No',NaN,NaN,NaN,NaN,NaN,NaN,NaN]}
    
df1 = pd.DataFrame(data)

# 1. 提取每个受试者的固定属性(ID、Risk,每个ID唯一)
id_static = df1.groupby('ID', as_index=False)['Risk'].max()

# 2. 统计每个受试者每周的检测非空数量:#of test
test_count = df1.groupby(['ID','Week'], as_index=False)['Testing'].agg(**{'#of test': lambda x: x.notna().sum()})

# 3. 处理依从性列,宽转长匹配对应周的依从性
adher_df = df1.melt(id_vars=['ID'], value_vars=['Week1_adher','Week2_adher','Week3_adher'],
                    var_name='Week', value_name='Adherence')
adher_df['Week'] = adher_df['Week'].str.replace('_adher','')
adher_df = adher_df.dropna().drop_duplicates()

# 4. 合并所有数据得到最终结果
final_df = id_static.merge(test_count, on='ID', how='left').merge(adher_df, on=['ID','Week'], how='left')

# 查看输出
print(final_df)

结果说明

最终输出的DataFrame每个受试者对应与实际参与周数相同的行数,包含5个字段:

  • ID:受试者编号
  • Risk:受试者风险等级
  • Week:统计周数
  • #of test:当前受试者当前周的Testing列非空值数量
  • Adherence:当前受试者对应周的依从性取值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:36:03