按列号切片pandas数据帧我不想要

时间:2014-03-19 20:17:40

标签: python pandas

我来自R世界,df[,-c(1,7)]函数可以很好地从数据框中选择除了非连续列数(在本例中为除了第1列和第7列之外的所有内容)之外的所有内容。< / p>

我试图在熊猫中做同样的事情。

这是一个虚拟数据帧:

df1 = pd.DataFrame({'a':range(10), 'b':range(10,20), 'c':list('abcdefghij'), 'g':[1]*3 + [2]*3 + [3]*4, 'f':[1]*3 + [2]*3 + [3]*4, 'j':[1]*3 + [2]*3 + [3]*4})

df1
   a   b  c  f  g  j
0  0  10  a  1  1  1
1  1  11  b  1  1  1
2  2  12  c  1  1  1
3  3  13  d  2  2  2
4  4  14  e  2  2  2
5  5  15  f  2  2  2
6  6  16  g  3  3  3
7  7  17  h  3  3  3
8  8  18  i  3  3  3
9  9  19  j  3  3  3

我知道我可以执行以下操作,选择我想要的列(而不是省略我不想要的内容):

df1[list(df1.columns[0:2]) + list(df1.columns[4:6])]

   a   b  g  j
0  0  10  1  1
1  1  11  1  1
2  2  12  1  1
3  3  13  2  2
4  4  14  2  2
5  5  15  2  2
6  6  16  3  3
7  7  17  3  3
8  8  18  3  3
9  9  19  3  3

但有没有办法告诉Pandas除了第2列和第3列以外我想要的一切?并且,我们可以扩展这个说我想要除第2列和第4列之外的所有内容吗?除了0:2和4之外的一切?

2 个答案:

答案 0 :(得分:2)

In [9]: df1.iloc[:,~pd.Int64Index(np.arange(len(df1.columns))).isin([2,4])]
Out[9]: 
   a   b  f  j
0  0  10  1  1
1  1  11  1  1
2  2  12  1  1
3  3  13  2  2
4  4  14  2  2
5  5  15  2  2
6  6  16  3  3
7  7  17  3  3
8  8  18  3  3
9  9  19  3  3

[10 rows x 4 columns]

用这个可以更清洁:

In [10]: ic = lambda x: pd.Int64Index(np.arange(x))

In [11]: df1.iloc[:,~ic(len(df1.columns)).isin([2,4])]
Out[11]: 
   a   b  f  j
0  0  10  1  1
1  1  11  1  1
2  2  12  1  1
3  3  13  2  2
4  4  14  2  2
5  5  15  2  2
6  6  16  3  3
7  7  17  3  3
8  8  18  3  3
9  9  19  3  3

[10 rows x 4 columns]

答案 1 :(得分:0)

一种方法是使用np.r_

中的numpy
import numpy as np
df2 = df[np.r_[0, 2, 4:]]

另一种方法是做类似的事情:

df2 = df[np.delete(np.arange(len(df.columns)), (2, 7))]