合并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出现重复值与异常值,请求排查原因并解决。
排查方向与解决方法
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)关联键存在重复条目
如果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')关联键数据类型不匹配
比如df['AWLEVEL']是字符串,awlevel['code']是整数,隐式类型转换可能导致错误匹配。
解决:统一数据类型:df['AWLEVEL'] = df['AWLEVEL'].astype(int) awlevel['code'] = awlevel['code'].astype(int)冗余的列重命名操作
代码中output_df.columns = [...]完全多余,因为选择的列名已经和期望一致,直接删除这行即可。
内容的提问来源于stack exchange,提问作者analyst92
相关产品推荐
相关产品推荐

