You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 AdvancedGrade 11 BasicGrade 12 AdvancedGrade 12 Basic
PS 11708710653
PS 2141168120167

内容的提问来源于stack exchange,提问作者FJJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:05:42