【问题标题】:Selecting last n columns and excluding last n columns in dataframe选择最后 n 列并排除数据框中的最后 n 列
【发布时间】:2016-01-07 15:50:36
【问题描述】:

我该怎么做:

  1. 选择数据框中的最后 3 列并创建一个新数据框?

我试过了:

y = dataframe.iloc[:,-3:]
  1. 排除最后 3 列并创建新数据框?

我试过了:

X = dataframe.iloc[:,:-3]

这是正确的吗?

我的代码中进一步出现数组维度错误,并希望确保此步骤正确。

谢谢

【问题讨论】:

    标签: python pandas indexing dataframe object-slicing


    【解决方案1】:

    只是做:

    y = dataframe[dataframe.columns[-3:]]
    

    这会分割列,以便您可以从 df 中进行子选择

    例子:

    In [221]:
    df = pd.DataFrame(columns=np.arange(10))
    df[df.columns[-3:]]
    
    Out[221]:
    Empty DataFrame
    Columns: [7, 8, 9]
    Index: []
    

    我认为这里的问题是,因为您已经获取了 df 的一部分,所以它返回了一个视图,但取决于您的其余代码正在做什么,它会发出警告。您可以通过调用.copy() 来制作显式副本以删除警告。

    所以如果我们复制一份,那么赋值只会影响副本而不影响原始df:

    In [15]:
    df = pd.DataFrame(np.random.randn(5,10), columns= np.arange(10))
    df
    
    Out[15]:
              0         1         2         3         4         5         6  \
    0  0.568284 -1.488447  0.970365 -1.406463 -0.413750 -0.934892 -1.421308   
    1  1.186414 -0.417366 -1.007509 -1.620530 -1.322004  0.294540  1.205115   
    2 -1.073894 -0.214972  1.516563 -0.705571  0.068666  1.690654 -0.252485   
    3  0.923524 -0.856752  0.226294 -0.660085  1.259145  0.400596  0.559028   
    4  0.259807  0.135300  1.130347 -0.317305 -1.031875  0.232262  0.709244   
    
              7         8         9  
    0  1.741925 -0.475619 -0.525770  
    1  2.137546  0.215665  1.908362  
    2  1.180281 -0.144652  0.870887  
    3 -0.609804 -0.833186 -1.033656  
    4  0.480943  1.971933  1.928037  
    
    In [16]:    
    y = df[df.columns[-3:]].copy()
    y
    
    Out[16]:
              7         8         9
    0  1.741925 -0.475619 -0.525770
    1  2.137546  0.215665  1.908362
    2  1.180281 -0.144652  0.870887
    3 -0.609804 -0.833186 -1.033656
    4  0.480943  1.971933  1.928037
    
    In [17]:    
    y[y>0] = 0
    print(y)
    df
    
              7         8         9
    0  0.000000 -0.475619 -0.525770
    1  0.000000  0.000000  0.000000
    2  0.000000 -0.144652  0.000000
    3 -0.609804 -0.833186 -1.033656
    4  0.000000  0.000000  0.000000
    Out[17]:
              0         1         2         3         4         5         6  \
    0  0.568284 -1.488447  0.970365 -1.406463 -0.413750 -0.934892 -1.421308   
    1  1.186414 -0.417366 -1.007509 -1.620530 -1.322004  0.294540  1.205115   
    2 -1.073894 -0.214972  1.516563 -0.705571  0.068666  1.690654 -0.252485   
    3  0.923524 -0.856752  0.226294 -0.660085  1.259145  0.400596  0.559028   
    4  0.259807  0.135300  1.130347 -0.317305 -1.031875  0.232262  0.709244   
    
              7         8         9  
    0  1.741925 -0.475619 -0.525770  
    1  2.137546  0.215665  1.908362  
    2  1.180281 -0.144652  0.870887  
    3 -0.609804 -0.833186 -1.033656  
    4  0.480943  1.971933  1.928037  
    

    这里没有发出警告,原始的 df 没有改变。

    【讨论】:

      【解决方案2】:

      这是因为使用了整数索引(ix 通过标签而不是位置选择那些,这是设计使然:请参阅 pandas "gotchas"* 中的整数索引)。

      *在新版本的 pandas 中更喜欢 loc 或 iloc 来消除 ix 作为位置或标签的歧义:

      df.iloc[-3:] 请参阅文档。

      正如 Wes 指出的,在这种特定情况下,您应该只使用 tail!

      还应该注意的是,在 Pandas 0.14 之前的版本中,iloc 会在越界访问时引发 IndexError,而 .head() 和 .tail() 则不会:

      pd.版本 '0.12.0' df = pd.DataFrame([{"a": 1}, {"a": 2}]) df.iloc[-5:] ... IndexError:切片越界(结束) df.tail(5) 一种 0 1 1 2 旧答案(折旧方法):

      您可以使用 irows DataFrame 方法来克服这种歧义:

      在 [11] 中:df1.irow(slice(-3, None)) 输出[11]: STK_ID RPT_Date T关闭销售折扣 8 568 20080331 38.75 12.668 南 9 568 20080630 30.09 21.102 南 10 568 20080930 26.00 30.769 南 注意:Series 也有类似的 iget 方法。

      【讨论】:

        【解决方案3】:

        最有效的方法:

        1.选择最后 n 列

        df1 = df.iloc[:,-n:]

        2。排除最后 n 列

        df1 = df.iloc[:,:-n]

        【讨论】:

          猜你喜欢
          • 2015-03-17
          • 2014-02-28
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-20
          相关资源
          最近更新 更多