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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:42:24