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

使用pandas将多行索引匹配的动态转换为多列

使用pandas将多行索引匹配的动态转换为多列

四季花海 2021-08-24 17:13:12
我需要从中转换以下数据框:class_id     instructor_id 1                10 2                10 2                20 3                30 3                40 3                50对此:class_id   instructor_id   instructor_id_2   instructor_id_3 1             10 2             10                   20 3             30                   40                       50唯一的 instuctor_id 列的数量将根据与每个 class_id 关联的instructor_id 编号的数量动态确定。instructor_id 列名称将延续与instructor_id_x 相同的模式。

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

使用groupby apply+list和apply+pd.Series作为:


df1 = df.groupby('class_id')['instructor_id'].apply(list).apply(pd.Series)

# alternative df.groupby('class_id')['instructor_id'].apply(lambda x: pd.Series(x.tolist())).unstack()

df1.columns = ['instructor_id']+['instructor_id_'+str(i+1) for i in df1.columns[1:]]

df1.reset_index(inplace=True)


print(df1)

   class_id  instructor_id  instructor_id_2  instructor_id_3

0         1           10.0              NaN              NaN

1         2           10.0             20.0              NaN

2         3           30.0             40.0             50.0


查看完整回答
反对 回复 2021-08-24
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

groupby+ cumcount+unstack

这是使用key助手系列的一种方法:


key = df.groupby('class_id')['instructor_id'].cumcount()\

        .add(1).map('Instructor_{}'.format)


res = df.set_index(['class_id', key]).unstack().reset_index()


# clean up column names

res.columns = res.columns.droplevel(0)

res = res.rename(columns={'': 'class_id'})


print(res)


   class_id  Instructor_1  Instructor_2  Instructor_3

0         1          10.0           NaN           NaN

1         2          10.0          20.0           NaN

2         3          30.0          40.0          50.0


查看完整回答
反对 回复 2021-08-24

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信