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

我需要从中转换以下数据框:


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 相同的模式。


四季花海
浏览 285回答 2
2回答

狐的传说

使用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_30         1           10.0              NaN              NaN1         2           10.0             20.0              NaN2         3           30.0             40.0             50.0

哈士奇WWW

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 namesres.columns = res.columns.droplevel(0)res = res.rename(columns={'': 'class_id'})print(res)   class_id  Instructor_1  Instructor_2  Instructor_30         1          10.0           NaN           NaN1         2          10.0          20.0           NaN2         3          30.0          40.0          50.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python