我有一个这样的数据框:
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_table
witg 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] 删除。
我来说两句