【问题标题】:Selecting a range of columns in Python在 Python 中选择一系列列
【发布时间】:2019-01-15 03:42:10
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: python arrays numpy indexing range


    【解决方案1】:

    高级索引不采用切片列表的列表。相反,您可以使用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]]
    

    【讨论】:

      【解决方案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]])
      

      【讨论】:

        【解决方案3】:

        联合范围怎么样?

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

        【讨论】:

          【解决方案4】:

          只是补充一些我的想法。使用 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
          

          【讨论】:

            【解决方案5】:

            可以用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]
            

            【讨论】:

              猜你喜欢
              • 2022-10-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-21
              • 1970-01-01
              • 1970-01-01
              • 2022-10-14
              • 2013-10-02
              相关资源
              最近更新 更多