使用Pandas基于三列删除CSV重复行仅生效一次的问题求助
基于多列删除CSV中的所有重复行
我有一个CSV文件,需要基于instrument_token、exchange_token、tradingsymbol三列删除重复行。尝试了以下代码,但仅删除了一次重复项,无法移除所有重复行。
ins.csv内容:
sr,instrument_token,exchange_token,tradingsymbol,name 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf
原Python代码:
import pandas as pd import numpy as np ins = pd.read_csv('ins.csv') new_ins = ins[pd.DataFrame(np.sort(ins[['instrument_token','exchange_token','tradingsymbol']].values.astype(str),1)).duplicated()] new_ins.to_csv('ins.csv', mode='w', header=new_ins.columns.tolist(), index=False)
问题分析
你原代码的逻辑完全搞反了:
pd.DataFrame(...).duplicated()会标记出重复出现的行,然后ins[这个布尔序列]是把这些重复行筛选出来保留,等于反过来保留了重复项,而不是删除它们。- 另外对列值排序后再判断重复是多余操作——你的需求是基于这三列的原始组合去重,不需要排序。
正确解决方案
用pandas内置的drop_duplicates()方法就能直接解决,它专门处理重复行,支持指定多列作为去重依据:
1. 保留每组重复行的第一个实例,删除后续重复(最常用)
import pandas as pd # 读取CSV文件 ins = pd.read_csv('ins.csv') # 指定去重的三列,保留第一组出现的行 new_ins = ins.drop_duplicates( subset=['instrument_token', 'exchange_token', 'tradingsymbol'], keep='first' ) # 写入回CSV,不要保留索引 new_ins.to_csv('ins.csv', index=False)
2. 删除所有重复行(包括第一个实例)
如果只要某组三列值重复,就把所有对应行都删掉,用keep=False:
import pandas as pd ins = pd.read_csv('ins.csv') new_ins = ins.drop_duplicates( subset=['instrument_token', 'exchange_token', 'tradingsymbol'], keep=False ) new_ins.to_csv('ins.csv', index=False)
3. 保留每组重复行的最后一个实例
如果需要保留最后一次出现的行,删除前面的重复项:
import pandas as pd ins = pd.read_csv('ins.csv') new_ins = ins.drop_duplicates( subset=['instrument_token', 'exchange_token', 'tradingsymbol'], keep='last' ) new_ins.to_csv('ins.csv', index=False)
处理后效果
用方案1处理后的ins.csv会只剩两行(每组重复的第一行):
sr,instrument_token,exchange_token,tradingsymbol,name 4,367376,2112,nf50,nf50 9,361216,2127,nfbf,nfbf
内容的提问来源于stack exchange,提问作者koceca
相关产品推荐
相关产品推荐

