如何用列表+非列表方式删除pandas DataFrame列并解决报错
报错原因
原代码的写法存在两个问题:
- 你尝试用
{}构造集合传入columns参数,但列表drop_cols是不可哈希类型,直接放进集合会直接触发TypeError: unhashable type: 'list'报错。 - 就算不触发哈希错误,这种写法会把整个
drop_cols列表当成集合里的单个元素,传给drop方法的是嵌套结构,pandas无法识别为合法的列名集合,依然会抛出找不到列的错误。
另外注意:不要用集合作为columns的参数,集合是无序结构,后续排查列相关问题时会增加不必要的成本,统一传入列名列表是最稳妥的做法。
修正代码
只需要把复用的drop_cols列表和单次使用的硬编码列合并成一维的列名列表,传入参数即可,两种常用写法都可以,且都不会修改原drop_cols列表的内容,不影响你后续在notebook其他位置复用:
- 列表解包写法(最简洁,推荐)
如果有2个单次使用的待删除列,直接把列名写在前面的列表里,再解包drop_cols就行:
drop_cols = ['var1', 'var2'] # 示例里除了var0,另一个单次删除列用var_tmp占位,按需替换成实际列名即可 df = df.drop(columns=['var0', 'var_tmp', *drop_cols])
- 列表拼接写法
直接把硬编码列组成的列表和drop_cols做拼接,效果和解包完全一致:
drop_cols = ['var1', 'var2'] df = df.drop(columns=['var0', 'var_tmp'] + drop_cols)
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

