在Python中选择一系列列

时间:2018-08-08 00:34:16

标签: python arrays numpy indexing

我有一个由0到10列组成的数据集,我想提取仅在1到5列而不是6列和7到9列中的信息(这意味着不是最后一个)。到目前为止,我已经执行了以下操作:

 A=B[:,[[1:5],[7:-1]]]

但是我遇到语法错误,如何获取该数据?

谢谢

5 个答案:

答案 0 :(得分:2)

高级索引不包含切片列表的列表。相反,您可以使用numpy.r_。此函数不使用负索引,但是您可以使用np.ndarray.shape来解决此问题:

A = B[:, np.r_[1:6, 7:B.shape[1]-1]]

请记住在第二部分加1,因为a: b不包括b,以同样的方式slice(a, b)不包括b。另请注意,索引从0开始。

这是一个演示:

import numpy as np

B = np.random.randint(0, 10, (3, 11))

print(B)

[[5 8 8 8 3 0 7 2 1 6 7]
 [4 3 8 7 3 7 5 6 0 5 7]
 [1 0 4 0 2 2 5 1 4 2 3]]

A = B[:,np.r_[1:6, 7:B.shape[1]-1]]

print(A)

[[8 8 8 3 0 2 1 6]
 [3 8 7 3 7 6 0 5]
 [0 4 0 2 2 1 4 2]]

答案 1 :(得分:2)

另一种方法是独立获取切片,然后进行串联:

A = np.concatenate([B[:, 1:6], B[:, 7:-1]], axis=1)

使用与@jpp类似的示例数据:

B = np.random.randint(0, 10, (3, 10))

>>> B
array([[0, 5, 0, 6, 8, 5, 9, 3, 2, 0],
       [8, 8, 1, 7, 3, 5, 7, 7, 4, 8],
       [5, 5, 5, 2, 3, 1, 6, 4, 9, 6]])

A = np.concatenate([B[:, 1:6], B[:, 7:-1]], axis=1)

>>> A
array([[5, 0, 6, 8, 5, 3, 2],
       [8, 1, 7, 3, 5, 7, 4],
       [5, 5, 2, 3, 1, 4, 9]])

答案 2 :(得分:1)

如何合并范围?

B[:, np.union1d(range(1,6), range(7,10))]

答案 3 :(得分:0)

只是补充一些我的想法。有两种方法可以使用 numpy 或 pandas。所以我会用一些数据来证明,假设数据是一个学生在他/她注册的不同课程中的成绩。

import pandas as pd
import numpy as np

data = {'Course A': [84, 82, 81, 89, 73, 94, 92, 70, 88, 95],
        'Course B': [85, 82, 72, 77, 75, 89, 95, 84, 77, 94],
        'Course C': [97, 94, 93, 95, 88, 82, 78, 84, 69, 78],
        'Course D': [84, 82, 81, 89, 73, 94, 92, 70, 88, 95],
        'Course E': [85, 82, 72, 77, 75, 89, 95, 84, 77, 94],
        'Course F': [97, 94, 93, 95, 88, 82, 78, 84, 69, 78]
        }

df = pd.DataFrame(data=data)
df.head()


    CA  CB  CC  CD  CE  CF
0   84  85  97  84  85  97
1   82  82  94  82  82  94
2   81  72  93  81  72  93
3   89  77  95  89  77  95
4   73  75  88  73  75  88

注意: CACF 代表 Course ACourse F.

为了帮助我们记住列名及其关联的索引,我们可以通过列表理解来构建一个列及其索引的列表。

map_cols = [f"{c[0]}:{c[1]}" for c in enumerate(df.columns)]

['0:Course A',
 '1:Course B',
 '2:Course C',
 '3:Course D',
 '4:Course E',
 '5:Course F']

现在,要使用 numpy 中的索引选择 Course ACourse DCourse F,您可以执行以下操作:

df.iloc[:, np.r_[0, 3:df.shape[1]]]

    CA  CD  CE  CF
0   84  84  85  97
1   82  82  82  94
2   81  81  72  93
3   89  89  77  95
4   73  73  75  88

您也可以使用 Pandas 来达到同样的效果。

df[[df.columns[0], *df.columns[3:]]]

    CA  CD  CE  CF
0   84  84  85  97
1   82  82  82  94
2   81  81  72  93
3   89  89  77  95
4   73  73  75  88

答案 4 :(得分:0)

可以用range的总和来解决这个问题

[In]: columns = list(range(1,6)) + list(range(7,10))
[Out]: 
[1, 2, 3, 4, 5, 7, 8, 9]

那么,考虑到你的df叫做df,使用iloc来选择DF列

newdf = df.iloc[:, columns]