如何在Pandas中一次性删除多段连续列?
Pandas DataFrame 删除多段连续列的最优方案
问题背景
需要从DataFrame中删除多段连续列,最终仅保留color和color2列。原本尝试用iloc分多行执行drop操作,但因每次删除后列索引重新调整,导致无需保留的列仍存在,希望用一行代码实现需求。
原始代码问题分析
原始代码中每次调用drop后,DataFrame的列会被重新排列,后续的iloc索引引用的是更新后的列位置,而非原始位置,因此无法准确删除目标列。比如第一次删除前2列后,剩余列的索引已发生变化,后续的iloc[:,4:5]指向的列已不是预期的目标列。
最优解决方案
方案1:直接保留指定列(推荐)
既然明确知道需要保留的列名,直接选择这些列是最简洁高效的方式,无需计算要删除的列:
import pandas as pd df = pd.DataFrame({'id': [100,200,300], 'user': ['Bob', 'Jane', 'Alice'], 'income': [50000, 60000, 70000], 'color':['red', 'green', 'blue'], 'state':['GA', 'PA', 'NY'], 'day':['M', 'W', 'Th'], 'color2':['red', 'green', 'blue'], 'state2':['GA', 'PA', 'NY'], 'id2': [100,200,300]}) # 直接保留目标列 df = df[['color', 'color2']]
也可以用reindex实现,效果一致:
df = df.reindex(columns=['color', 'color2'])
方案2:合并要删除的列索引后一次性删除
如果坚持用索引方式删除,先合并所有需要删除的连续列的索引,再一次性执行删除操作,避免多次删除导致的索引偏移问题:
import pandas as pd df = pd.DataFrame({'id': [100,200,300], 'user': ['Bob', 'Jane', 'Alice'], 'income': [50000, 60000, 70000], 'color':['red', 'green', 'blue'], 'state':['GA', 'PA', 'NY'], 'day':['M', 'W', 'Th'], 'color2':['red', 'green', 'blue'], 'state2':['GA', 'PA', 'NY'], 'id2': [100,200,300]}) # 合并所有要删除的列的原始索引 drop_indices = list(range(0, 3)) + list(range(4, 6)) + list(range(7, 9)) # 一次性删除目标列 df.drop(df.columns[drop_indices], axis=1, inplace=True)
解释:原始DataFrame中,color在索引3,color2在索引6,因此需要删除的是索引0-2(id、user、income)、4-5(state、day)、7-8(state2、id2),合并这些索引后一次性删除即可得到目标结果。
内容的提问来源于stack exchange,提问作者zb3693
相关产品推荐
相关产品推荐

