长格式和宽格式之间存在混合。最好的办法是让所有表格都采用长格式。
math = pd.DataFrame(
{
'math': ['Student1', 'Student2', 'Student3'],
'score': [44, 35, 36]
}
)
other = pd.DataFrame(
{
'student_id': 2*['Student1', 'Student2', "Student3"],
'subject': 3*['english', 'science'],
'score': [50, 37, 36, 44, 47, 30]
}
)
otherdf是
|
学生卡 |
主题 |
分数 |
| 0 |
学生1 |
英语 |
50 |
| 1 |
学生2 |
科学 |
37 |
| 2 |
学生3 |
英语 |
36 |
| 3 |
学生1 |
科学 |
44 |
| 4 |
学生2 |
英语 |
47 |
| 5 |
学生3 |
科学 |
30 |
和mathdf 是
|
数学 |
分数 |
| 0 |
学生1 |
44 |
| 1 |
学生2 |
35 |
| 2 |
学生3 |
36 |
长格式
# for the long format
math['subject']="math"
math = math.rename(columns={'math': 'student_id'})
|
学生卡 |
分数 |
主题 |
| 0 |
学生1 |
44 |
数学 |
| 1 |
学生2 |
35 |
数学 |
| 2 |
学生3 |
36 |
数学 |
other.append(math).sort_values(['subject', 'student_id'])
|
学生卡 |
主题 |
分数 |
| 0 |
学生1 |
英语 |
50 |
| 4 |
学生2 |
英语 |
47 |
| 2 |
学生3 |
英语 |
36 |
| 0 |
学生1 |
数学 |
44 |
| 1 |
学生2 |
数学 |
35 |
| 2 |
学生3 |
数学 |
36 |
| 3 |
学生1 |
科学 |
44 |
| 1 |
学生2 |
科学 |
37 |
| 5 |
学生3 |
科学 |
30 |
宽幅面
# the key to merge dfs is student_id
math_wide = math.rename(columns={'math': 'student_id', 'score': 'math'})
math_wide
|
学生卡 |
数学 |
| 0 |
学生1 |
44 |
| 1 |
学生2 |
35 |
| 2 |
学生3 |
36 |
other_wide = other.pivot(index='student_id', columns="subject", values='score').reset_index()
other_wide = other_wide.rename_axis(None, axis=1).reset_index(drop=True)
all_subject = other_wide.merge(math_wide, on='student_id')
|
学生卡 |
英语 |
科学 |
数学 |
| 0 |
学生1 |
50 |
44 |
44 |
| 1 |
学生2 |
47 |
37 |
35 |
| 2 |
学生3 |
36 |
30 |
36 |