为何Pandas处理3万行数据集时,按Name筛选重复项失效?
问题描述
按Name列分组,保留该列值出现多次的记录。以下代码在3列6行的小数据集上运行正常,但处理30列3万行的数据集时,仅选取Name、Email、IBAN三列执行相同代码,却无法过滤掉仅出现一次的行,求原因及解决办法。
代码示例
import pandas as pd data={'Name':['Danny','Damny','Monny','Quony','Dimny','Danny'], 'Email':['danny@gmail.com','danny@gmail.com','monny@gmail.com','quony@gmail.com','danny@gmail.com','danny@gmail.com'], 'IBAN':['NLAMRO123456789','NLINGB126656723','BGFFEO128856754','NLAMRO123896763','DUDMRO567456722','NLRABO123456712']} #data with three columns df=pd.DataFrame(data) #creation of dataframe df['No Dutch Bank']=None #creation of extra column for analysis df.loc[df['IBAN'].str.find('NL') == -1, 'No Dutch Bank']='ja'# to find rows, which contain non dutch bank numbers. df_filt=df[['Name',"Email", "IBAN"]]#filtering columns needed in the final results df_gb = df_filt[df_filt.duplicated(subset=['Name'], keep=False)].sort_values(by='Name', ascending=False).reset_index(drop=True)#filtering on a required column piv_tab = pd.pivot_table(df_gb, index=['Name',"Email", "IBAN"])#applying pivot table piv_tab
原因分析与解决方案
核心原因
小数据集能正常运行,大数据集失效,大概率是**Name列存在隐性的字符串差异**,而这种差异在小数据里不存在:
- 字符串首尾有隐藏空格:比如有的行是
'Danny',有的是'Danny '(末尾多空格),Pandas会判定这是两个不同的值,不会标记为重复 - 大小写不一致:比如
'Danny'和'danny'被视为不同值,导致无法被duplicated识别为重复项 - 存在缺失值:如果
Name列有单个NaN,duplicated不会将其标记为重复行,会被保留下来
解决办法
1. 先清洗Name列的字符串
先统一处理Name列的格式,消除隐性差异:
# 去除首尾空格 df_filt['Name'] = df_filt['Name'].str.strip() # 统一转为小写(或者大写,保持一致即可) df_filt['Name'] = df_filt['Name'].str.lower()
2. 替换过滤逻辑(更稳定的方式)
用value_counts统计每个Name的出现次数,再筛选出现次数>1的记录,这种方法比duplicated更直观,也能避免隐性问题:
# 统计每个Name的出现次数 name_counts = df_filt['Name'].value_counts() # 筛选出出现多次的Name repeated_names = name_counts[name_counts > 1].index # 过滤数据集 df_gb = df_filt[df_filt['Name'].isin(repeated_names)].sort_values(by='Name', ascending=False).reset_index(drop=True)
3. 处理缺失值(如果有)
先检查Name列的缺失情况,再决定是否删除:
# 查看缺失值数量 print(df_filt['Name'].isna().sum()) # 删除Name列为空的行 df_filt = df_filt.dropna(subset=['Name'])
内容的提问来源于stack exchange,提问作者Rohit Nirmal
相关产品推荐
相关产品推荐

