【发布时间】:2019-12-12 07:33:51
【问题描述】:
我有一个如下所示的数据框
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]})
如下图所示
我希望我的输出如下所示
这是我根据其他帖子的 SO 建议尝试的,但我无法产生或接近预期的输出
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) 我只想在 all 3 columns 的 NA 一起删除 NA 记录(在这种情况下,pid = 4,BP1Date,BP1di,BP1sy 是 NA)。如果任何一列不是 NA,则应保留 NA,如下所示。因此我没有使用 stack(dropna=False) 而是基于 SO 帖子使用 pd.melt
如何转换输入以实现如上截图所示的输出?
根据 Answer cmets 更新截图
【问题讨论】:
标签: python python-3.x pandas dataframe pandas-groupby