我有一个从名为 test_data 的 csv 文件导入的 DataFrame,其结构如下:
学校名称 | 考试成绩 | 11年级学生 | 12年级学生 |
---|---|---|---|
PS 1 | 高级 | 170 | 106 |
PS 1 | 基本 | 87 | 53 |
PS 2 | 高级 | 141 | 120 |
PS 2 | 基本 | 168 | 167 |
我希望每所学校的数据只在一行中,所以我使用 .pivot_table() 来执行此操作:
test_data_by_grade_11 = test_data.pivot_table("Students in Grade 11", ["School Name"], "Test Score")
test_data_by_grade_12 = test_data.pivot_table(("Students in Grade 12", ["School Name"], "Test Score")
test_data_by_grade_11.rename(columns = {"Advanced":"Grade 11 Advanced", "Basic":"Grade 11 Basic"}, inplace = True)
test_data_by_grade_12.rename(columns = {"Advanced":"Grade 12 Advanced", "Basic":"Grade 12 Basic"}, inplace = True)
然后我成功得到了两张这样的表格,表格标题上方有“考试成绩”字样:
学校名称 | 11年级进阶 | 11年级基础 |
---|---|---|
PS 1 | 170 | 87 |
PS 2 | 141 | 168 |
学校名称 | 12年级进阶 | 12年级基础 |
---|---|---|
PS 1 | 106 | 53 |
PS 2 | 120 | 167 |
我想将这些数据透视表合并回一起创建一个这样的表:
学校名称 | 11年级进阶 | 11年级基础 | 12年级进阶 | 12年级基础 |
---|---|---|---|---|
PS 1 | 170 | 87 | 106 | 53 |
PS 2 | 141 | 168 | 120 | 167 |
但是,当我尝试合并它们时,我得到的数据确实有偏差,并且与 .csv 文件不匹配,如下所示:
学校名称 | 11年级进阶 | 11年级基础 | 12年级进阶 | 12年级基础 |
---|---|---|---|---|
PS 1 | 170 | 87 | 87 | 105 |
PS 2 | 170 | 87 | 87 | 136 |
PS 3 | 170 | 87 | 87 | 85 |
PS 4 | 170 | 87 | 87 | 96 |
(文件中确实存在 12 年级的基本值,但肯定与正确的行不匹配)。
由于这些重复,输出返回近 500 万行,而原始 .csv 文件大约有 6500 行。不确定这里发生了什么或我遗漏了什么 - 我怀疑这与 left_on 或 right_on 有关属性,但我已经玩过这些并且还没有得到想要的表。
只需一个即可获得最终的dataframe
.pivot
:
df = df.rename(columns={'Students in Grade 11': 'Grade 11', 'Students in Grade 12': 'Grade 12'})
out = df.pivot(index='School Name', columns='Test Score')
out.columns = [f'{a} {b}' for a, b in out.columns]
print(out.reset_index())
印花:
School Name Grade 11 Advanced Grade 11 Basic Grade 12 Advanced Grade 12 Basic
0 PS 1 170 87 106 53
1 PS 2 141 168 120 167
略有相似的结果:
df=df.pivot_table(index=['学校名称'],columns='考试成绩',
values=['11年级学生','12年级学生'])
#concat column level index name with level 0 index name using list comprehension:
df.columns=[(col[0] + '-' + col[1]) for col in df.columns]
最后重置行级索引:
df.reset_index(就地=真)