Python:重新排列分类数据帧

时间:2018-02-11 19:07:05

标签: python pandas dataframe categorical-data

我的数据框看起来像这样:

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,但它需要一个值字段。任何的想法?谢谢

1 个答案:

答案 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)

产生与上述相同的结果。