如何用Python Pandas移除两个CSV文件中的重复行
解决方法:用Pandas筛选掉A.csv中姓名存在于B.csv的行
嘿,你的问题出在对B.csv的结构处理错误以及用了不合适的合并去重方法上——B.csv是单一行包含多个姓名,而不是每行一条记录,直接合并两个文件再去重根本没法匹配到要删除的行。下面是正确的实现步骤和代码:
步骤分析
我们的核心需求是:从A.csv中移除所有姓名出现在B.csv里的行。所以需要先把B.csv里的所有姓名提取成一个干净的列表,再用这个列表过滤A.csv的数据。
完整代码实现
import pandas as pd # 1. 读取A.csv:指定无表头,自定义列名方便操作 df_a = pd.read_csv('A.csv', header=None, names=['Name', 'Number', 'Color']) # 2. 处理B.csv:提取所有姓名并清理格式 # 方式一:用原生文件操作读取(更直观) with open('B.csv', 'r') as f: raw_names = f.readline().strip().split(',') # 去掉每个姓名的前后空格,过滤掉空字符串(因为B.csv末尾有多余逗号) b_name_list = [name.strip() for name in raw_names if name.strip()] # 方式二:用Pandas读取(如果习惯用Pandas操作) # df_b = pd.read_csv('B.csv', header=None) # b_name_list = [name.strip() for name in df_b.iloc[0].tolist() if name.strip()] # 3. 筛选A.csv中姓名不在B列表里的行 result_df = df_a[~df_a['Name'].isin(b_name_list)] # 4. 保存结果:不输出索引和表头(和原文件格式一致) result_df.to_csv('output.csv', index=False, header=False)
代码解释
- 读取A.csv时指定
header=None是因为原文件没有表头,自定义列名后更容易通过Name列筛选数据。 - 处理B.csv时,我们把单行的姓名分割成列表,同时清理掉空格和空值(比如B.csv末尾的逗号会产生空字符串),得到干净的姓名列表。
~df_a['Name'].isin(b_name_list)表示“取A中姓名不在B列表里的行”,isin用来判断元素是否在列表中,~是取反操作。- 保存时设置
index=False和header=False,确保输出的CSV和你期望的格式完全一致(没有索引和表头)。
为什么你的原方法不行?
你之前用cat A.csv B.csv > output.csv合并两个文件,得到的是混合结构的行:有的行是3个字段(来自A),有的行是多个姓名(来自B)。drop_duplicates只会删除完全重复的整行,而这里根本没有完全重复的行,所以完全达不到删除目标行的效果。
内容的提问来源于stack exchange,提问作者Ignacio Inda
相关产品推荐
相关产品推荐

