如何在不丢失 Pandas 行数据的情况下合并数据透视表

问题描述 投票:0回答:1

我有一个从名为 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 有关属性,但我已经玩过这些并且还没有得到想要的表。

python pandas dataframe pivot-table
1个回答
1
投票

只需一个即可获得最终的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
© www.soinside.com 2019 - 2024. All rights reserved.