如何单步从Pandas DataFrame中选取a、c-g列并排除b列
Pandas 单步选取指定列范围并排除特定列实现方案
你可以直接通过单条命令完成「选取a到g列区间、排除b列」的需求,不需要分两步执行删除操作,也不需要手动枚举所有目标列。
首先需要注意:你当前的写法逻辑是反向的,~df.columns.isin(columns)会排除你传入列表里的所有列,和你想要保留这些列的需求刚好相反。
原生的df.loc[:,'a':'g']连续切片语法不支持直接在语句内写排除规则,配合pandas索引的内置方法即可实现需求,推荐两种写法:
- 鲁棒性写法(不依赖列的固定排列位置,只要列名存在就可正常运行)
df2 = df.loc[:, df.columns[df.columns.get_loc('a') : df.columns.get_loc('g')+1].difference(['b'], sort=False)]
代码逻辑说明:
- 用
get_loc()分别拿到列a和列g对应的索引位置,由于位置切片是左闭右开规则,取g的位置后+1保证g列被包含 - 取到a到g的连续列索引后,用
difference(['b'], sort=False)直接排除b列,sort=False参数可以保证列保留原表中的相对顺序,不会被自动重排,最终返回的列就是你需要的a、c、e、f、g
- 如果你确定列顺序不会变动,可以写得更简洁:
# 对应你给出的列顺序,前6列就是a、b、c、e、f、g,排除b后即为目标列 df2 = df.loc[:, df.columns[:6].difference(['b'], sort=False)]
如果你后续需要排除多个列,只需要给
difference()传入对应的列名列表即可,比如要同时排除b和d,就写.difference(['b','d'], sort=False)
内容的提问来源于stack exchange,提问作者Lucas Cordeiro Romão
相关产品推荐
相关产品推荐

