Pandas合并两个CSV数据帧去重及读取CSV出现NaN值问题求解
问题解决方法
第一步:修复csv1读取异常
你遇到的csv1读取后id列全为NaN的问题,是因为每行末尾多余的逗号导致pandas错误识别列数、把数值列当成了索引。读取时指定仅提取id列即可修复:
# 读取csv1时仅保留有效id列,自动忽略末尾逗号产生的空列 df1 = pd.read_csv('./csv1.csv', usecols=['id']) # 可以执行下面的代码验证读取结果,确认id列没有NaN # print(df1['id'].isna().sum())
第二步:提取两个文件的独有数值
这里提供两种实现方案,你可以根据需求选择:
方案1:集合运算(适合仅需获取独有值列表的场景,代码简洁效率高)
import pandas as pd # 读取两个文件 df1 = pd.read_csv('./csv1.csv', usecols=['id']) df2 = pd.read_csv('./csv2.csv', usecols=['IDNumber']) # 转为集合自动去重 set1 = set(df1['id'].dropna()) set2 = set(df2['IDNumber'].dropna()) # csv1独有的值 csv1_unique = set1 - set2 # csv2独有的值 csv2_unique = set2 - set1 # 若需要导出为csv可使用以下代码 # pd.DataFrame({'id': list(csv1_unique)}).to_csv('csv1独有值.csv', index=False) # pd.DataFrame({'IDNumber': list(csv2_unique)}).to_csv('csv2独有值.csv', index=False)
方案2:pandas原生方法(适合需要保留DataFrame结构、后续还要做其他数据处理的场景)
import pandas as pd # 读取两个文件 df1 = pd.read_csv('./csv1.csv', usecols=['id']) df2 = pd.read_csv('./csv2.csv', usecols=['IDNumber']) # 提取csv1独有的行(排除两个文件共有的值) df1_unique = df1[~df1['id'].isin(df2['IDNumber'])].drop_duplicates() # 提取csv2独有的行 df2_unique = df2[~df2['IDNumber'].isin(df1['id'])].drop_duplicates()
原代码错误原因说明
你之前使用pd.concat时传入的是一个单列Series和一个DataFrame,默认按列拼接后会生成两个不同列名的列,重复值分属不同列,按行去重的drop_duplicates自然无法识别。不需要用拼接的方式实现需求,直接用集合运算或isin筛选即可。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

