猿问

使用 pandas 将数据帧从长转换为宽 - 单行输出

我有一个如下所示的数据框


df = pd.DataFrame({

'subject_id':[1,1,1,1,2,2,2,2],

'date':['2173/04/11','2173/04/12','2173/04/11','2173/04/12','2173/05/14','2173/05/15','2173/05/14','2173/05/15'],

'time_1':['2173/04/11 12:35:00','2173/04/12 12:50:00','2173/04/11 12:59:00','2173/04/12 13:14:00','2173/05/14 13:37:00','2173/05/15 13:39:00','2173/05/14 18:37:00','2173/05/15 19:39:00'],

 'val' :[5,5,40,40,7,7,38,38],

 'iid' :[12,12,12,12,21,21,21,21]   

 })

df['time_1'] = pd.to_datetime(df['time_1'])

df['day'] = df['time_1'].dt.day

我尝试使用stack,unstack,pivot and melt方法,但似乎没有帮助


pd.melt(df, id_vars =['subject_id','val'], value_vars =['date','val']) #1


df.unstack().reset_index()  #2


df.pivot(index='subject_id', columns='time_1', values='val')  #3 

我希望我的输出数据框如下所示

更新截图

在此处输入图像描述

在此处输入图像描述


幕布斯6054654
浏览 101回答 1
1回答

蓝山帝景

想法是GroupBy.cumcount使用相同的列/列为新索引创建辅助系列 - 在这里subject_id,创建MultiIndex,重塑DataFrame.unstack和最后展平MulitIndex in columns:cols = ['time_1','val']df = df.set_index(['subject_id', df.groupby('subject_id').cumcount().add(1)])[cols].unstack()df.columns = [f'{a}{b}' for a, b in df.columns]df = df.reset_index()print (df)   subject_id             time_11             time_12             time_13  \0           1 2173-04-11 12:35:00 2173-04-12 12:50:00 2173-04-11 12:59:00   1           2 2173-05-14 13:37:00 2173-05-15 13:39:00 2173-05-14 18:37:00                 time_14  val1  val2  val3  val4  0 2173-04-12 13:14:00     5     5    40    40  1 2173-05-15 19:39:00     7     7    38    38  如果id组数不同,则需要缺少值 -unstack使用最大计数,然后添加错误值:df = pd.DataFrame({'subject_id':[1,1,1,2,2,3],'date':['2173/04/11','2173/04/12','2173/04/11','2173/04/12','2173/05/14','2173/05/15'],'time_1':['2173/04/11 12:35:00','2173/04/12 12:50:00','2173/04/11 12:59:00',          '2173/04/12 13:14:00','2173/05/14 13:37:00','2173/05/15 13:39:00'], 'val' :[5,5,40,40,7,7], 'iid' :[12,12,12,12,21,21]    })df['time_1'] = pd.to_datetime(df['time_1'])df['day'] = df['time_1'].dt.dayprint (df)   subject_id        date              time_1  val  iid  day0           1  2173/04/11 2173-04-11 12:35:00    5   12   111           1  2173/04/12 2173-04-12 12:50:00    5   12   122           1  2173/04/11 2173-04-11 12:59:00   40   12   113           2  2173/04/12 2173-04-12 13:14:00   40   12   124           2  2173/05/14 2173-05-14 13:37:00    7   21   145           3  2173/05/15 2173-05-15 13:39:00    7   21   15cols = ['time_1','val']df = df.set_index(['subject_id', df.groupby('subject_id').cumcount().add(1)])[cols].unstack()df.columns = [f'{a}{b}' for a, b in df.columns]df = df.reset_index()print (df)   subject_id             time_11             time_12             time_13  \0           1 2173-04-11 12:35:00 2173-04-12 12:50:00 2173-04-11 12:59:00   1           2 2173-04-12 13:14:00 2173-05-14 13:37:00                 NaT   2           3 2173-05-15 13:39:00                 NaT                 NaT      val1  val2  val3  0   5.0   5.0  40.0  1  40.0   7.0   NaN  2   7.0   NaN   NaN  
随时随地看视频慕课网APP

相关分类

Python
我要回答