通过不需要的列编号切片pandas数据框

0 投票
2 回答
1074 浏览
提问于 2025-04-17 23:01

我之前在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]

撰写回答