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

合并DataFrame后出现重复值与异常值问题求助(Python 3)

问题排查:合并DataFrame出现重复值与异常值

数据集样本

主DataFrame df

UNITID  CIPCODE AWLEVEL CTOTALT
100654  1.0999  5        9
100654  1.1001  5        10
100654  1.1001  7        6

uni_names 数据集

UNITID    institution_name
100654    Alabama A & M University
100663    University of Alabama at Birmingham
100690    Amridge University

cipcodes 数据集

cipcode_value   program_name
01.0000         Agriculture, General
01.0101         Agricultural Business and Management, General
01.0102         Agribusiness/Agricultural Business Operations

awlevel 数据集

code    type    
3       Associate's degree
5       Bachelor's degree
7       Master's degree

期望输出

institution_name    program_name    type    CTOTALT

我的代码

import pandas as pd

# 读取主数据集
df = pd.read_csv('master_data.csv')

# 读取院校名称数据集
uni_names = pd.read_csv('uni_names.csv')

# 读取CIP代码数据集
cipcodes = pd.read_csv('cipcodes.csv')

# 读取学位级别数据集
awlevel = pd.read_csv('awlevel.csv')

# 合并df与uni_names(基于UNITID)
merged_df = df.merge(uni_names, on='UNITID')

# 合并merged_df与cipcodes(基于CIPCODE和cipcode_value)
merged_df = merged_df.merge(cipcodes, left_on='CIPCODE', right_on='cipcode_value')

# 合并merged_df与awlevel(基于AWLEVEL和code)
merged_df = merged_df.merge(awlevel, left_on='AWLEVEL', right_on='code')

# 选择目标列并重命名
output_df = merged_df[['institution_name', 'program_name', 'type', 'CTOTALT']]
output_df.columns = ['institution_name', 'program_name', 'type', 'CTOTALT']

# 打印结果
print(output_df)

问题

运行上述代码后,输出的DataFrame出现重复值与异常值,请求排查原因并解决。


排查方向与解决方法

  1. CIPCODE格式不匹配
    观察样本数据:df的CIPCODE是不带前导零的数值(如1.0999),而cipcodes的cipcode_value是带前导零的字符串(如01.0000),格式不一致会导致匹配失败或错误匹配。
    解决:统一两边格式:

    # 将df的CIPCODE格式化为带前导零的字符串,保留四位小数
    df['CIPCODE'] = df['CIPCODE'].apply(lambda x: f"{x:06.4f}")
    # 确保cipcodes的cipcode_value为字符串类型
    cipcodes['cipcode_value'] = cipcodes['cipcode_value'].astype(str)
    
  2. 关联键存在重复条目
    如果uni_names、cipcodes或awlevel中,关联键(UNITID、cipcode_value、code)对应多条记录,合并时会产生笛卡尔积,导致重复行。
    解决:先检查并去重:

    # 检查各数据集关联键是否重复
    print("uni_names的UNITID重复:", uni_names['UNITID'].duplicated().any())
    print("cipcodes的cipcode_value重复:", cipcodes['cipcode_value'].duplicated().any())
    print("awlevel的code重复:", awlevel['code'].duplicated().any())
    
    # 对有重复的数据集去重,保留第一条记录
    uni_names = uni_names.drop_duplicates(subset='UNITID', keep='first')
    cipcodes = cipcodes.drop_duplicates(subset='cipcode_value', keep='first')
    awlevel = awlevel.drop_duplicates(subset='code', keep='first')
    
  3. 关联键数据类型不匹配
    比如df['AWLEVEL']是字符串,awlevel['code']是整数,隐式类型转换可能导致错误匹配。
    解决:统一数据类型:

    df['AWLEVEL'] = df['AWLEVEL'].astype(int)
    awlevel['code'] = awlevel['code'].astype(int)
    
  4. 冗余的列重命名操作
    代码中output_df.columns = [...]完全多余,因为选择的列名已经和期望一致,直接删除这行即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:54:54