使用Pandas删除DataFrame列代码失效,求排查问题原因
问题分析与修复方案
嘿,我一眼就揪出问题啦!你的代码逻辑思路没问题,但忽略了Pandas中drop()方法的一个关键特性——它默认不会直接修改原DataFrame,而是返回一个删除指定列后的新DataFrame对象。
问题根源
当你执行df.drop([col], axis=1)时,Pandas确实完成了删除列的操作,但这个操作的结果只是一个临时的新DataFrame,你既没有把它重新赋值给df,也没让它直接修改原数据。所以循环跑完后,原df完全没变化,最后导出的out.csv自然和原文件一模一样。
两种修复方法
方法一:使用inplace=True参数直接修改原DataFrame
这个参数会让drop()方法直接在原DataFrame上执行删除操作,不需要额外赋值:
import pandas df = pandas.read_csv('data.csv') for col in df.columns.values: if input('Delete ' + col + '? yes/no') == 'yes': df.drop([col], axis=1, inplace=True) # 新增inplace=True参数 df.to_csv('out.csv')
方法二:将drop()的返回值重新赋值给df
如果你不想修改原数据(虽然这里你需要修改),可以把删除后的新DataFrame重新赋值给df:
import pandas df = pandas.read_csv('data.csv') for col in df.columns.values: if input('Delete ' + col + '? yes/no') == 'yes': df = df.drop([col], axis=1) # 把新对象赋值回df df.to_csv('out.csv')
额外小提示
你这里用df.columns.values获取初始列列表来循环是没问题的,因为它是循环开始前就固定的列名集合。要是你循环时用for col in df.columns(动态获取当前列),边删边遍历可能会导致某些列被跳过,这点以后可以留意下~
内容的提问来源于stack exchange,提问作者Vincent W.
相关产品推荐
相关产品推荐

