为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2022-06-07 16:46:07
我有一个如下所示的数据框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']) #1df.unstack().reset_index()  #2df.pivot(index='subject_id', columns='time_1', values='val')  #3 我希望我的输出数据框如下所示更新截图
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

想法是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.day

print (df)

   subject_id        date              time_1  val  iid  day

0           1  2173/04/11 2173-04-11 12:35:00    5   12   11

1           1  2173/04/12 2173-04-12 12:50:00    5   12   12

2           1  2173/04/11 2173-04-11 12:59:00   40   12   11

3           2  2173/04/12 2173-04-12 13:14:00   40   12   12

4           2  2173/05/14 2173-05-14 13:37:00    7   21   14

5           3  2173/05/15 2173-05-15 13:39:00    7   21   15

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-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  


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号