在pandas中按位置选择多个数据帧列

时间:2018-01-31 14:54:44

标签: python pandas select indices

我有一个(大)数据帧。如何按位置选择特定列?例如第1..3,5,6列

我试图以这种方式执行此操作,而不是仅删除column4,因为我的数据集中有大量行,我想按位置选择:

 df=df[df.columns[0:2,4:5]]

但是这会给IndexError: too many indices for array

DF输入

 Col1     Col2     Col3       Col4        Col5       Col6
 1        apple    tomato     pear        banana     banana
 1        apple    grape      nan         banana     banana
 1        apple    nan        banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        apple    tomato     banana      banana     banana
 1        avacado  tomato     banana      banana     banana
 1        toast    tomato     banana      banana     banana
 1        grape    tomato     egg         banana     banana

DF输出 - 所需

 Col1     Col2     Col3       Col5       Col6
 1        apple    tomato     banana     banana
 1        apple    grape      banana     banana
 1        apple    nan        banana     banana
 1        apple    tomato     banana     banana
 1        apple    tomato     banana     banana
 1        apple    tomato     banana     banana     
 1        avacado  tomato     banana     banana     
 1        toast    tomato     banana     banana     
 1        grape    tomato     banana     banana

5 个答案:

答案 0 :(得分:3)

您可以这样选择第0,1,4列:

df.iloc[:, [0, 1, 4]]

您可以在Indexing and Selecting Data中了解详情。

  

•iloc主要基于整数位置(从0到长度-1)   ()),但也可以与布尔数组一起使用。 .iloc会提高   如果请求的索引器超出限制,则为IndexError,但slice除外   允许越界索引的索引器。 (这符合   python / numpy slice语义)。允许的输入是:

     

◦整数,例如5

     

◦整数列表或数组[4,3,0]

     

◦具有整数1:7的切片对象

     

◦布尔数组

     

◦带有一个参数的可调用函数(调用Series,DataFrame   或者)并返回有效的索引输出(其中一个)   以上)

答案 1 :(得分:3)

你需要的是numpy np.r_

df.iloc[:,np.r_[0:2,4:5]]
Out[265]: 
   Col1     Col2    Col5
0     1    apple  banana
1     1    apple  banana
2     1    apple  banana
3     1    apple  banana
4     1    apple  banana
5     1    apple  banana
6     1  avacado  banana
7     1    toast  banana
8     1    grape  banana

答案 2 :(得分:1)

错误OP face来自df.columns[0:2,4:5],其中放入的索引太多。 IIUC,您可以将所需的所有列名称放在一起进行选择。

from itertools import chain
cols_to_select = list(v for v in chain(df.columns[0:2], df.columns[4:5]))
df_filtered = df[cols_to_select]

如果cols_to_select中可能存在名称冲突,请使用iloc作为jp_data_analysis建议进行选择,或按Wen建议使用np.r_进行选择。

答案 3 :(得分:1)

您还可以将rangeconcatenate中的numpy一起使用,并获取使用np.concatenate组合两个不同范围的列:

import numpy as np
df = df[df.columns[np.concatenate([range(0,3),range(4,6)])]]
df

输出:

   Col1     Col2    Col3    Col5    Col6
0     1    apple  tomato  banana  banana
1     1    apple   grape  banana  banana
2     1    apple     NaN  banana  banana
3     1    apple  tomato  banana  banana
4     1    apple  tomato  banana  banana
5     1    apple  tomato  banana  banana
6     1  avacado  tomato  banana  banana
7     1    toast  tomato  banana  banana
8     1    grape  tomato  banana  banana

答案 4 :(得分:0)

使用pandas iloc方法:

df_filtered = df.iloc[:, [1,2,3,5,6]]