更改数据框的结构

斯里测试

我有一个这样的数据框:

id|sem|stu
1|sem2|A
1|sem1|B
1|sem1|C
2|sem1|A
2|sem3|A

我希望这样重新建模:

   sem1|sem2|sem3|sem4
1  B|A|NaN|NaN
1  C|A|NaN|NaN
2  A|NaN|A|NaN

我尝试了以下代码:

df.pivot(index='stu',columns='id',values='sub')

输出不是我预期的结果。有人可以提出他们的想法吗?

安塞夫

我认为您需要DataFrame.pivot_tablewitg aggfunc =''.join或其他对str类型有效的

new_df = (df.pivot_table(index = 'id',columns = 'sem',
                         values = 'stu',aggfunc = ''.join)
            .rename_axis(columns = None,index = None))
print(new_df)
  sem1 sem2 sem3
1    B    A  NaN
2    A  NaN    A

例如,您可以使用另一个函数来处理针对相同ID和sem重复的值first,尽管在这里不丢失信息的方法是''.join


更新

print(df)
   id   sem stu
0   1  sem2   A
1   1  sem1   B
2   1  sem1   A
3   2  sem1   A
4   2  sem3   A

new_df=( df.assign(count=df.groupby(['id','sem']).cumcount())
           .pivot_table(index = 'id',columns = ['sem','count'],
                        values = 'stu',aggfunc = ''.join)
           .rename_axis(columns = [None,None],index = None) )
print(new_df)
  sem1      sem2 sem3
     0    1    0    0
1    B    A    A  NaN
2    A  NaN  NaN    A

new_df=( df.assign(count=df.groupby(['id','sem']).cumcount())
           .pivot_table(index = ['id','count'],columns = 'sem',
                        values = 'stu',aggfunc = ''.join)
           .rename_axis(columns = None,index = [None,None]) )
print(new_df)
    sem1 sem2 sem3
1 0    B    A  NaN
  1    A  NaN  NaN
2 0    A  NaN    A

没有MultIndex的解决方案

new_df=( df.assign(count=df.groupby(['id','sem']).cumcount())
           .pivot_table(index = 'id',columns = ['sem','count'],
                        values = 'stu',aggfunc = ''.join)
           .rename_axis(columns = [None,None],index = None) )

#Solution with duplicates names of columns
#new_df.columns = new_df.columns.droplevel(1)
#  sem1 sem1 sem2 sem3
#1    B    C    A  NaN
#2    A  NaN  NaN    A

new_df.columns = [f'{x}_{y}' for x,y in new_df.columns]
print(new_df)
  sem1_0 sem1_1 sem2_0 sem3_0
1      B      C      A    NaN
2      A    NaN    NaN      A

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章