如何在Pandas中合并透视表,避免数据错位与重复问题
问题分析与解决方案
核心问题原因
你遇到的行数暴增(从6500行到500万行)、数据错位和列重复问题,本质是合并时未正确指定关联键,导致Pandas执行了笛卡尔积(交叉连接),而非基于学校名称的精准匹配。另外你写的第二个透视表存在语法错误,也会影响后续操作。
方案1:修正合并逻辑(基于原有两个透视表)
步骤1:修复透视表语法错误
第二个pivot_table的括号位置错误,修正后代码如下:
# 修正语法错误的透视表代码 test_data_by_grade_11 = test_data.pivot_table("11年级学生数", ["学校名称"], "测试成绩") test_data_by_grade_12 = test_data.pivot_table("12年级学生数", ["学校名称"], "测试成绩") # 重命名列 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)
步骤2:基于索引精准合并
两个透视表均以学校名称为索引,合并时需明确指定以索引作为关联键,避免笛卡尔积:
# 基于索引合并,确保一对一匹配 merged_df = test_data_by_grade_11.merge(test_data_by_grade_12, left_index=True, right_index=True) # 将索引转为列(可选,根据需求调整) merged_df.reset_index(inplace=True)
方案2:一步完成透视(更高效,避免合并操作)
无需拆分两个透视表,直接一次性生成目标结构的DataFrame,减少中间步骤和出错概率:
# 一次性透视多列值 pivoted_df = test_data.pivot_table( values=["11年级学生数", "12年级学生数"], index=["学校名称"], columns=["测试成绩"] ) # 扁平化多级列名,生成目标列格式 pivoted_df.columns = [ f"Grade {col[0][0]} {col[1]}" for col in pivoted_df.columns ] # 重置索引,将学校名称转为普通列 pivoted_df.reset_index(inplace=True)
执行后pivoted_df将直接生成你需要的结构:
| 学校名称 | Grade 11 Advanced | Grade 11 Basic | Grade 12 Advanced | Grade 12 Basic |
|---|---|---|---|---|
| PS 1 | 170 | 87 | 106 | 53 |
| PS 2 | 141 | 168 | 120 | 167 |
内容的提问来源于stack exchange,提问作者FJJ
相关产品推荐
相关产品推荐

