我的数据框看起来像这样:
Subject Student ID
Math 304
Math 506
... ...
History 304
History 402
... ...
English 506
English 402
一个科目可以有几个学生,但每个学生只有两个科目。我希望以这样的方式重新排列数据框,其中主题顺序无关紧要:
Student ID Subject1 Subject2
304 Math History
506 Math English
402 History English
我已尝试过pivot_values,但它需要一个值字段。任何的想法?谢谢
答案 0 :(得分:1)
鉴于df
:
In [83]: df
Out[83]:
Subject Student ID
0 Math 304
1 Math 506
2 History 304
3 History 402
4 English 506
5 English 402
使用groupby/cumcount
创建列号。这将从0开始对每组中的元素进行编号:
In [84]: df['col'] = df.groupby('Student ID').cumcount()
In [85]: df
Out[85]:
Subject Student ID col
0 Math 304 0
1 Math 506 0
2 History 304 1
3 History 402 0
4 English 506 1
5 English 402 1
然后你可以pivot:
In [91]: result = df.pivot(index='Student ID', columns='col', values='Subject')
In [92]: result.columns = 'Student' + (result.columns+1).astype(str)
In [93]: result
Out[93]:
Student1 Student2
Student ID
304 Math History
402 History English
506 Math English
或者,作为cmaher points out,使用add_prefix
可以更加整洁地完成相同的工作:
import pandas as pd
df = pd.DataFrame({
'Student ID': [304, 506, 304, 402, 506, 402],
'Subject': ['Math', 'Math', 'History', 'History', 'English', 'English']})
df['col'] = df.groupby('Student ID').cumcount()+1
result = df.pivot(index='Student ID', columns='col', values='Subject')
result = result.add_prefix('Subject')
print(result)
产生与上述相同的结果。