Pandas中无法去除Customer Number重复值的问题求助
问题:合并Excel后按'Customer Number'去重无效的原因及解决办法
问题描述
合并三个Excel文件的数据后,尝试按Customer Number列去除重复值,但最终输出文件并未排除任何重复项。
代码回顾
import pandas as pd import numpy as np #numpy是可处理大型数据集错误的模块 from openpyxl import load_workbook from openpyxl.styles import Font df_1 = pd.read_excel('PRT Tracings 2020.xlsx', sheet_name='Export') #读取Excel文档的指定工作表 df_2 = pd.read_excel('PRT Tracings 2021.xlsx', sheet_name='Export') #读取同一Excel文档的另一工作表 df_3 = pd.read_excel('PRT Tracings YTD 2022.xlsx', sheet_name='Export') #读取另一Excel文件,该文件仅一个工作表 df_all = pd.concat([df_1, df_2, df_3], sort=False) #合并三个DataFrame,sort=False保持列顺序不变 to_excel = df_all.to_excel('Combined_PRT_Tracings.xlsx', index=None) #将合并后的数据保存为Excel文件 df_all = df_all.replace(np.nan, 'N/A', regex=True) #将空值替换为N/A remove = ['ORDERNUMBER', 'ORDER_TYPE', 'ORDERDATE', 'Major Code Description', 'Product_Number_And_Desc', 'Qty', 'Order_$', 'Order_List_$'] #定义需要删除的列 df_all.drop(columns=remove, inplace=True) df_all.drop_duplicates(subset=['Customer Number'], keep=False) #按Customer Number列去除所有重复项 to_excel = df_all.to_excel('Combined_PRT_Tracings.xlsx', index=None) #将处理后的数据保存到Excel文件 wb = load_workbook('Combined_PRT_Tracings.xlsx') #使用openpyxl读取已创建的Excel文件 ws = wb.active #激活工作表 wb.save('Combined_PRT_Tracings.xlsx')
核心问题分析及解决
1. drop_duplicates操作未生效
你的代码中执行df_all.drop_duplicates(subset=['Customer Number'], keep=False)时,没有将结果赋值回原DataFrame,也未使用inplace=True参数。Pandas的大多数操作默认返回新对象,不会修改原数据,所以这行代码相当于白执行,原df_all完全没变化。
解决办法二选一:
- 方式一:将结果赋值给
df_all
df_all = df_all.drop_duplicates(subset=['Customer Number'], keep=False)
- 方式二:使用
inplace=True直接修改原DataFrame
df_all.drop_duplicates(subset=['Customer Number'], keep=False, inplace=True)
2. 潜在的隐藏问题:Customer Number列数据不一致
即使修正了上述问题,仍可能存在去重无效的情况,常见原因有:
- 数据类型不统一:比如有的
Customer Number是整数,有的是字符串(例如"123"和123会被视为不同值) - 存在前后空格:例如" 123 "和"123"看起来相同,但实际是不同的字符串
额外处理建议:
在去重前先统一数据格式:
# 统一转为字符串类型 df_all['Customer Number'] = df_all['Customer Number'].astype(str) # 去除前后空格 df_all['Customer Number'] = df_all['Customer Number'].str.strip()
修改后的完整代码
import pandas as pd import numpy as np from openpyxl import load_workbook # 读取文件 df_1 = pd.read_excel('PRT Tracings 2020.xlsx', sheet_name='Export') df_2 = pd.read_excel('PRT Tracings 2021.xlsx', sheet_name='Export') df_3 = pd.read_excel('PRT Tracings YTD 2022.xlsx', sheet_name='Export') # 合并数据 df_all = pd.concat([df_1, df_2, df_3], sort=False) # 空值替换 df_all = df_all.replace(np.nan, 'N/A', regex=True) # 删除指定列 remove = ['ORDERNUMBER', 'ORDER_TYPE', 'ORDERDATE', 'Major Code Description', 'Product_Number_And_Desc', 'Qty', 'Order_$', 'Order_List_$'] df_all.drop(columns=remove, inplace=True) # 处理Customer Number列,统一格式 df_all['Customer Number'] = df_all['Customer Number'].astype(str).str.strip() # 去重并生效 df_all.drop_duplicates(subset=['Customer Number'], keep=False, inplace=True) # 保存结果 df_all.to_excel('Combined_PRT_Tracings.xlsx', index=None) # 如果不需要修改样式,下面两行可以省略 wb = load_workbook('Combined_PRT_Tracings.xlsx') wb.save('Combined_PRT_Tracings.xlsx')
内容的提问来源于stack exchange,提问作者qtsweeney3535
相关产品推荐
相关产品推荐

