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

Python 使用pandas将具有匹配索引的多行动态转换为多列,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我需要从中转换以下数据帧: 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

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

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

唯一的instructor id列的数量将根据与每个班级id相关联的教员id号的数量动态确定。教员id列名称将继续使用教员id的相同模式。

使用
groupby
应用
+
列表
应用
+
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
+ + 以下是使用
助手系列的一种方法:

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

为了简单起见,我的帖子中只包含了两个栏目。实际上,我还有两个额外的列,叫做“location\u id”和“course\u id”。如何显示这些列以及动态创建的新列?我可以使用df1并在class_id上将其连接到df,但我认为将“class_id”、“location_id”和“couse_id”组合在一起是一种更有效的方法。在尝试了多种方法后,我不断得到一个错误:例如:df1=df.groupby('class_id','location_id','course_id')['讲师_id'].apply(列表).apply(pd.Series)@RyanFasenmyer您能否提供一个完整的示例来验证该案例。以下是一个完整的示例:从以下内容转换:课程id课程id讲师id位置id 33001330040300501:班级id课程id讲师id讲师id讲师id 2讲师id 3位置id 1100 1 2 200 10 1 3 300 3040 50 1我发现我的评论格式不正确,因此您可能无法看到我试图传达的内容。我不确定在事后添加更完整的示例的最佳实践是什么。