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

3

我可以帮您将以下数据框从这个格式转换为另一个格式:

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

根据每个class_id关联的instructor_id数量动态确定唯一instructor_id列的数目。 instructor_id列名称将继续保持instructor_id_x的相同模式。

2个回答

2

使用 groupbyapply+listapply+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

为了简单起见,我在帖子中只包含了两列信息。实际上,我还有两列名为“location_id”和“course_id”的额外列。 请问如何在新动态创建的列旁边显示这些列? 我可以将df1与df在class_id上连接,但我怀疑通过仅将'class_id'、'location_id'和'couse_id' 分组来执行更有效的操作。尝试多种方法后,我一直出现错误:例如: df1 = df.groupby('class_id','location_id','course_id')['instructor_id'].apply(list).apply(pd.Series) - Ryan Fasenmyer
@RyanFasenmyer,你能提供一个最小、完整、可验证的示例来验证这个案例吗? - Space Impact
这是一个完整的例子:转换为: 课程编号 课程ID 授课教师编号 上课地点编号 3 300 30 1 3 300 40 1 3 300 50 1 - Ryan Fasenmyer
班级编号 课程编号 授课教师编号 第二授课教师编号 第三授课教师编号 地点编号 1 100 10 1 2 200 10 20 1 3 300 30 40 50 1 - Ryan Fasenmyer
我发现我的评论格式不正确,所以您可能无法看到我想传达的内容。我不确定事后添加更完整的示例的最佳做法是什么。 - Ryan Fasenmyer

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接