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我发现我的评论格式不正确,因此您可能无法看到我试图传达的内容。我不确定在事后添加更完整的示例的最佳实践是什么。