按标签删除列范围

时间:2015-01-30 03:58:28

标签: python pandas

假设我有这么大的数据框:

In [31]: df
Out[31]: 
    A   B   C   D   E   F   G   H   I   J ...   Q   R   S   T   U   V   W   X   Y   Z
0   0   1   2   3   4   5   6   7   8   9 ...  16  17  18  19  20  21  22  23  24  25
1  26  27  28  29  30  31  32  33  34  35 ...  42  43  44  45  46  47  48  49  50  51
2  52  53  54  55  56  57  58  59  60  61 ...  68  69  70  71  72  73  74  75  76  77

[3 rows x 26 columns]

您可以使用

创建
alphabet = [chr(letter_i) for letter_i in range(ord('A'), ord('Z')+1)]
df = pd.DataFrame(np.arange(3*26).reshape(3, 26), columns=alphabet)

使用列标签删除列'D''R'之间所有列的最佳方法是什么?

我发现了一种难看的方式:

df.drop(df.columns[df.columns.get_loc('D'):df.columns.get_loc('R')+1], axis=1)

4 个答案:

答案 0 :(得分:6)

这是我的参赛作品:

>>> df.drop(df.columns.to_series()["D":"R"], axis=1)
    A   B   C   S   T   U   V   W   X   Y   Z
0   0   1   2  18  19  20  21  22  23  24  25
1  26  27  28  44  45  46  47  48  49  50  51
2  52  53  54  70  71  72  73  74  75  76  77

通过将df.columnsIndex转换为Series,我们可以利用["D":"R"]式选择:

>>> df.columns.to_series()["D":"R"]
D        D
E        E
F        F
G        G
H        H
I        I
J        J
...    ...
Q        Q
R        R
dtype: object

答案 1 :(得分:2)

你在这里:

print df.ix[:,'A':'C'].join(df.ix[:,'S':'Z'])

Out[1]: 
    A   B   C   S   T   U   V   W   X   Y   Z
0   0   1   2  18  19  20  21  22  23  24  25
1  26  27  28  44  45  46  47  48  49  50  51
2  52  53  54  70  71  72  73  74  75  76  77

答案 2 :(得分:1)

这是另一种方式......

low, high = df.columns.get_slice_bound(('D', 'R'), 'left')
drops = df.columns[low:high+1]
print df.drop(drops, axis=1)


    A   B   C   S   T   U   V   W   X   Y   Z
0   0   1   2  18  19  20  21  22  23  24  25
1  26  27  28  44  45  46  47  48  49  50  51
2  52  53  54  70  71  72  73  74  75  76  77

答案 3 :(得分:0)

使用numpy获得更大的灵活性... numpy允许比较字母(可能通过比较ASCII位级别或其他东西):

import numpy as np
array = (['A','B','C','D'])
array > 'B'
print(array)
print(array>'B')

给出:

['A' 'B' 'C' 'D']
array([False, False,  True,  True], dtype=bool)

也很容易选择更难的选择:

b[np.logical_and(b>'B', b<'D')]

给出:

array(['C'], 
  dtype='|S1')