我有一个如下所示的数据帧
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为all 3 columns
时删除NA记录(在本例中,对于pid=4,BP1Date,BP1di,BP1sy为NA)。如果任何列不是NA,则应保留NA,如下所示。因此,我没有使用stack(dropna=False),而是基于SO posts使用pd.melt
如何转换输入以实现屏幕截图中所示的输出
根据答案评论更新截图
使用} 进行重塑,然后按} 删除缺少的值,并按前3列排序:
lreshape
和^{Date
列按^{另一种解决方案是在由^{} 和^{} 创建的列中使用
MultiIndex
:相关问题 更多 >
编程相关推荐