【问题标题】:Panda .loc or .iloc to select the columns from a datasetPanda .loc 或 .iloc 从数据集中选择列
【发布时间】:2017-09-13 19:28:04
【问题描述】:

我一直在尝试从数据集中为所有行选择一组特定的列。我尝试了类似下面的方法。

train_features = train_df.loc[,[0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]]

我想提一下,所有行都包含在内,但只需要编号的列。 有没有更好的方法来解决这个问题。

样本数据:

age  job        marital   education    default   housing   loan   equities   contact     duration   campaign   pdays   previous   poutcome   emp.var.rate   cons.price.idx   cons.conf.idx   euribor3m     nr.employed   y
56   housemaid  married   basic.4y     1         1         1      1          0           261        1          999     0          2          1.1            93.994           -36.4           3.299552287   5191          1
37   services   married   high.school  1         0         1      1          0           226        1          999     0          2          1.1            93.994           -36.4           0.743751247   5191          1
56   services   married   high.school  1         1         0      1          0           307        1          999     0          2          1.1            93.994           -36.4           1.28265179    5191          1

我试图忽略数据集中的工作、婚姻、教育和 y 列。 y 列是目标变量。

【问题讨论】:

    标签: python python-2.7 python-3.x pandas


    【解决方案1】:

    如果需要按职位选择,请使用iloc:

    train_features = train_df.iloc[:, [0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]]
    print (train_features)
       age  default  housing  loan  equities  contact  duration  campaign  pdays  \
    0   56        1        1     1         1        0       261         1    999   
    1   37        1        0     1         1        0       226         1    999   
    2   56        1        1     0         1        0       307         1    999   
    
       previous  poutcome  emp.var.rate  cons.price.idx  cons.conf.idx  euribor3m  \
    0         0         2           1.1          93.994          -36.4   3.299552   
    1         0         2           1.1          93.994          -36.4   0.743751   
    2         0         2           1.1          93.994          -36.4   1.282652   
    
       nr.employed  
    0         5191  
    1         5191  
    2         5191  
    

    另一种解决方案是drop不必要的列:

    cols= ['job','marital','education','y']
    train_features = train_df.drop(cols, axis=1)
    print (train_features)
       age  default  housing  loan  equities  contact  duration  campaign  pdays  \
    0   56        1        1     1         1        0       261         1    999   
    1   37        1        0     1         1        0       226         1    999   
    2   56        1        1     0         1        0       307         1    999   
    
       previous  poutcome  emp.var.rate  cons.price.idx  cons.conf.idx  euribor3m  \
    0         0         2           1.1          93.994          -36.4   3.299552   
    1         0         2           1.1          93.994          -36.4   0.743751   
    2         0         2           1.1          93.994          -36.4   1.282652   
    
       nr.employed  
    0         5191  
    1         5191  
    2         5191  
    

    【讨论】:

    • 你好@jezrael.. 感谢您的快速回复。但不幸的是,我尝试了上述方法,但出现以下错误。 TypeError: cannot concatenate a non-NDFrame object 无法弄清楚为什么会出现这个问题。你能提供任何指针吗?
    • 你能添加一些数据样本吗?
    【解决方案2】:

    您可以通过底层 numpy 数组访问列值

    考虑数据框df

    df = pd.DataFrame(np.random.randint(10, size=(5, 20)))
    df
    

    你可以对底层数组进行切片

    slc = [0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
    df.values[:, slc]
    
    array([[1, 3, 9, 8, 3, 2, 1, 6, 6, 0, 3, 9, 8, 5, 9, 9],
           [8, 0, 2, 3, 7, 8, 9, 2, 7, 2, 1, 3, 2, 5, 4, 9],
           [1, 1, 9, 3, 5, 8, 8, 8, 8, 4, 8, 0, 5, 4, 9, 0],
           [6, 3, 1, 8, 0, 3, 7, 9, 9, 0, 9, 7, 6, 1, 4, 8],
           [3, 2, 3, 3, 9, 8, 3, 8, 3, 4, 1, 6, 4, 1, 6, 4]])
    

    或者你可以从这个切片重建一个新的数据帧

    pd.DataFrame(df.values[:, slc], df.index, df.columns[slc])
    

    不像

    那样简洁直观
    df.iloc[:, slc]
    

    您还可以使用slcdf.columns 对象进行切片并将其传递给df.loc

    df.loc[:, df.columns[slc]]
    

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2018-02-08
      • 2021-12-06
      • 2019-09-06
      相关资源
      最近更新 更多