通过不需要的列编号切片pandas数据框
我之前在R语言中工作,那里有个功能叫df[,-c(1,7)]
,可以很方便地选择数据框中除了第1列和第7列以外的所有列。
现在我想在Pandas中做同样的事情。
这里有一个示例数据框:
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
一种方法是使用 numpy
里的 np.r_
。
import numpy as np
df2 = df[np.r_[0, 2, 4:]]
另一种方法是做类似这样的事情:
df2 = df[np.delete(np.arange(len(df.columns)), (2, 7))]
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]