如何用Pandas按Name筛选CSV数据并避免输出覆盖?
解决Pandas筛选Excel/CSV数据时的覆盖问题与优化方案
为啥你的代码会覆盖数据?
咱们先拆解下你原来的代码逻辑:每次循环都重新读取整个some.xlsx文件,筛选单个Name的数据,然后直接调用to_csv写入文件——默认情况下to_csv会覆盖目标文件,所以循环跑完后,只有最后一次循环的结果(也就是Name为B的数据)被保留了。而且每次重复读文件,在Name列表很大的时候会超级低效,完全没必要。
修复+优化后的完整代码
针对你的需求,我整理了更高效的写法,同时解决覆盖问题和索引列问题:
import pandas as pd # 1. 只读取一次源文件,避免重复IO操作(重点!) df = pd.read_excel('some.xlsx', index_col=False) # 2. 定义需要筛选的Name列表(哪怕列表很大也没问题) target_names = ['A', 'B'] # 3. 一次性筛选所有符合条件的行,指定要保留的列 filtered_df = df.loc[df['Name'].isin(target_names), ['Name', 'address', 'post', 'city']] # 4. 写入CSV,index=False去除索引列,不会覆盖之前的正确结果 filtered_df.to_csv('ABC.csv', index=False)
关键优化点解释(给Pandas新手的小科普)
- 只读一次文件:原来的循环每次都读整个Excel,IO操作是很耗时的,尤其文件大的时候,读一次就够啦。
- 用
isin()替代循环筛选:isin()是Pandas专门用来匹配列表/数组值的方法,比循环逐个判断高效N倍,代码也更简洁,适合处理大列表的场景。 index=False参数:这个参数告诉Pandas不要把默认的索引列写入CSV,正好满足你去除输出索引列的需求。
额外的新手小提示
- 如果你的源文件是CSV而不是Excel,把
pd.read_excel改成pd.read_csv就行,参数用法基本一致。 - 可以加一行
print(filtered_df)来确认筛选结果是否正确,方便调试。 - 如果后续需要追加数据到同一个CSV(比如分批筛选),可以用
to_csv(..., mode='a'),但记得第一次写入时加header=True,后续追加时加header=False避免重复写表头,不过你的场景里一次性筛选就不需要这个啦。
内容的提问来源于stack exchange,提问作者steveJ
相关产品推荐
相关产品推荐

