如何使用pandas的iloc选取DataFrame两段不连续列并保留全部行
语法报错原因及修正写法
你写的df.iloc[:,[0:12,16:]]不符合Python语法规则:切片表达式a:b不能直接作为列表的元素传入,仅能在索引操作符[]内直接使用,或是转换为范围对象后再拼接。
pandas中实现跨范围选列的正确写法有两种:
- 方法1(需引入numpy):使用
np.r_将多个切片转换为连续的索引数组,注意pandas切片为左闭右开规则,要取0-12列需写0:13,取16-27列需写16:28:
import numpy as np X = df.iloc[:, np.r_[0:13, 16:28]]
- 方法2(无额外依赖):手动拼接目标列的索引列表:
selected_cols = list(range(13)) + list(range(16, df.shape[1])) X = df.iloc[:, selected_cols]
NaN异常原因
你临时写的代码是算术加法操作,不是列拼接操作:pandas中两个DataFrame做+运算时,会自动按列名、行索引对齐后计算值,你的两个子DataFrame列名完全不重叠,所以所有位置计算结果都会填充为NaN,完全不符合你要的合并列的需求。
正确的列拼接写法如下:
X = pd.concat([df.iloc[:, 0:13], df.iloc[:, 16:]], axis=1)
另外要注意你原来写的0:12实际只能取到0到11列,会漏掉第12列,需要修正为0:13。
内容的提问来源于stack exchange,提问作者RFAI
相关产品推荐
相关产品推荐

