我有一个数据框,如下所示
df2 = pd.DataFrame({'pid':[1,2,3,4],'BP1Date':['12/11/2016','12/21/2016','12/31/2026',np.nan],'BP1di':[21,24,25,np.nan],'BP1sy':[123,125,127,np.nan],'BP2Date':['12/31/2016','12/31/2016','12/31/2016','12/31/2016'],'BP2di':[21,26,28,30],'BP2sy':[123,130,135,145],
'BP3Date':['12/31/2017','12/31/2018','12/31/2019','12/31/2116'],'BP3di':[21,31,36,np.nan],'BP3sy':[123,126,145,np.nan]})
看起来如下图所示
我希望我的输出如下所示
这是我根据其他帖子的建议尝试的,但我无法产生或接近预期的输出
df = pd.melt(df2, id_vars='pid', var_name='col', value_name='dates')
df['col2'] = [x.split("Date")[0][:3] for x in df['col']]
df = df[df.groupby(['pid','col2'])['dates'].transform('count').ne(0)].copy()
df['col3'] = df['col2'].str.extract('(\d+)', expand=True).astype(int)
df2 = df.sort_values(by=['pid','col3'])
请注意两点
a) 对于每个日期,我有两个读数 (BP{n}di, BP{n}si)
b) 我只想在 NA 为 NA 时才删除 NA 记录all 3 columns
一起(在本例中,对于 pid = 4,BP1Date、BP1di、BP1sy 为 NA)。如果任何列不是 NA,则应保留 NA,如下所示。因此我没有使用 stack(dropna=False) 而是使用基于 SO 帖子的 pd.melt
如何转换输入以获得如上屏幕截图所示的输出?
根据回答评论更新了屏幕截图