首页 文章

如何在pandas中获取数据帧的列切片

提问于
浏览
193

我从csv文件加载一些机器学习数据 . 前两列是观察,其余列是特征 .

目前,我做以下事项:

data = pandas.read_csv('mydata.csv')

这给出了类似的东西:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))

我想将这个数据帧分成两个数据帧:一个包含 ab 列,另一个包含 cde 列 .

写不出类似的东西是不可能的

observations = data[:'c']
features = data['c':]

我不确定最好的方法是什么 . 我需要 pd.Panel 吗?

顺便说一句,我发现数据帧索引非常不一致:允许 data['a'] ,但 data[0] 不允许 . 另一方面,不允许 data['a':] ,但 data[0:] 是 . 这是否有实际原因?如果列由Int索引,这确实令人困惑,因为 data[0] != data[0:1]

9 回答

  • 0

    2017答案 - pandas 0.20:.ix已弃用 . 使用.loc

    deprecation in the docs

    .loc 使用基于标签的索引来选择行和列 . 标签是索引或列的值 . 使用 .loc 切片包含最后一个元素 .

    假设我们有一个包含以下列的DataFrame:foo,bar,quz,ant,cat,sat,dat .

    # selects all rows and all columns beginning at 'foo' up to and including 'sat'
    df.loc[:, 'foo':'sat']
    # foo bar quz ant cat sat
    

    .loc 接受Python列表对行和列执行的相同切片表示法 . 切片表示法 start:stop:step

    # slice from 'foo' to 'cat' by every 2nd column
    df.loc[:, 'foo':'cat':2]
    # foo quz cat
    
    # slice from the beginning to 'bar'
    df.loc[:, :'bar']
    # foo bar
    
    # slice from 'quz' to the end by 3
    df.loc[:, 'quz'::3]
    # quz sat
    
    # attempt from 'sat' to 'bar'
    df.loc[:, 'sat':'bar']
    # no columns returned
    
    # slice from 'sat' to 'bar'
    df.loc[:, 'sat':'bar':-1]
    sat cat ant quz bar
    
    # slice notation is syntatic sugar for the slice function
    # slice from 'quz' to the end by 2 with slice function
    df.loc[:, slice('quz',None, 2)]
    # quz cat dat
    
    # select specific columns with a list
    # select columns foo, bar and dat
    df.loc[:, ['foo','bar','dat']]
    # foo bar dat
    

    您可以按行和列切片 . 例如,如果您有5行标签 v0127976x0127978z

    # slice from 'w' to 'y' and 'foo' to 'ant' by 3
    df.loc['w':'y', 'foo':'ant':3]
    #    foo ant
    # w
    # x
    # y
    
  • 24

    DataFrame.ix索引是您要访问的内容 . 这有点令人困惑(我同意Pandas索引有时令人困惑!),但以下似乎做你想要的:

    >>> df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
    >>> df.ix[:,'b':]
          b         c         d         e
    0  0.418762  0.042369  0.869203  0.972314
    1  0.991058  0.510228  0.594784  0.534366
    2  0.407472  0.259811  0.396664  0.894202
    3  0.726168  0.139531  0.324932  0.906575
    

    其中.ix [行切片,列切片]是正在解释的内容 . 关于Pandas索引的更多内容:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced

    Note: .ix 自Pandas v0.20以来已被弃用 . 您应该根据需要使用 .loc.iloc .

  • 18

    让我们使用seaborn包中的泰坦尼克数据集作为例子

    # Load dataset (pip install seaborn)
    >> import seaborn.apionly as sns
    >> titanic = sns.load_dataset('titanic')
    

    使用列名称

    >> titanic.loc[:,['sex','age','fare']]
    

    使用列索引

    >> titanic.iloc[:,[2,3,6]]
    

    使用ix(比熊猫<.20版本更老)

    >> titanic.ix[:,[‘sex’,’age’,’fare’]]
    

    要么

    >> titanic.ix[:,[2,3,6]]
    

    使用reindex方法

    >> titanic.reindex(columns=['sex','age','fare'])
    
  • 146

    另外,给定一个DataFrame

    数据

    在你的例子中,如果你想只提取a和d列(e.i.第1和第4列),你需要的是大熊猫数据帧中的iloc mothod,并且可以非常有效地使用 . 您需要知道的是要提取的列的索引 . 例如:

    >>> data.iloc[:,[0,3]]
    

    会给你

    a         d
    0  0.883283  0.100975
    1  0.614313  0.221731
    2  0.438963  0.224361
    3  0.466078  0.703347
    4  0.955285  0.114033
    5  0.268443  0.416996
    6  0.613241  0.327548
    7  0.370784  0.359159
    8  0.692708  0.659410
    9  0.806624  0.875476
    
  • 9

    您可以通过引用列表中每列的名称来切割 DataFrame 的列,如下所示:

    data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
    data_ab = data[list('ab')]
    data_cde = data[list('cde')]
    
  • 59

    如果你来到这里寻找切割两个范围的列并将它们组合在一起(像我一样),你可以做类似的事情

    op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
    print op
    

    这将创建一个新的数据框,其中前900列和(所有)列> 3593(假设您的数据集中有大约4000列) .

  • 0

    以下是使用不同方法进行选择性列切片的方法, including selective label based, index based and the selective ranges based column slicing.

    In [37]: import pandas as pd    
    In [38]: import numpy as np
    In [43]: df = pd.DataFrame(np.random.rand(4,7), columns = list('abcdefg'))
    
    In [44]: df
    Out[44]: 
              a         b         c         d         e         f         g
    0  0.409038  0.745497  0.890767  0.945890  0.014655  0.458070  0.786633
    1  0.570642  0.181552  0.794599  0.036340  0.907011  0.655237  0.735268
    2  0.568440  0.501638  0.186635  0.441445  0.703312  0.187447  0.604305
    3  0.679125  0.642817  0.697628  0.391686  0.698381  0.936899  0.101806
    
    In [45]: df.loc[:, ["a", "b", "c"]] ## label based selective column slicing 
    Out[45]: 
              a         b         c
    0  0.409038  0.745497  0.890767
    1  0.570642  0.181552  0.794599
    2  0.568440  0.501638  0.186635
    3  0.679125  0.642817  0.697628
    
    In [46]: df.loc[:, "a":"c"] ## label based column ranges slicing 
    Out[46]: 
              a         b         c
    0  0.409038  0.745497  0.890767
    1  0.570642  0.181552  0.794599
    2  0.568440  0.501638  0.186635
    3  0.679125  0.642817  0.697628
    
    In [47]: df.iloc[:, 0:3] ## index based column ranges slicing 
    Out[47]: 
              a         b         c
    0  0.409038  0.745497  0.890767
    1  0.570642  0.181552  0.794599
    2  0.568440  0.501638  0.186635
    3  0.679125  0.642817  0.697628
    
    ### with 2 different column ranges, index based slicing: 
    In [49]: df[df.columns[0:1].tolist() + df.columns[1:3].tolist()]
    Out[49]: 
              a         b         c
    0  0.409038  0.745497  0.890767
    1  0.570642  0.181552  0.794599
    2  0.568440  0.501638  0.186635
    3  0.679125  0.642817  0.697628
    
  • 144

    它的等价物

    >>> print(df2.loc[140:160,['Relevance','Title']])
     >>> print(df2.ix[140:160,[3,7]])
    
  • 32

    如果数据框看起来像这样:

    group         name      count
    fruit         apple     90
    fruit         banana    150
    fruit         orange    130
    vegetable     broccoli  80
    vegetable     kale      70
    vegetable     lettuce   125
    

    和OUTPUT可能是一样的

    group    name  count
    0  fruit   apple     90
    1  fruit  banana    150
    2  fruit  orange    130
    

    如果你使用逻辑运算符np.logical_not

    df[np.logical_not(df['group'] == 'vegetable')]
    

    更多关于

    https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html

    其他逻辑运算符

    • logical_and(x1,x2,/ [,out,where,...])按元素计算x1和x2的真值 .

    • logical_or(x1,x2,/ [,out,where,casting,...])按元素计算x1 OR x2的真值 .

    • logical_not(x,/ [,out,where,casting,...])计算NOT x元素的真值 .

    • logical_xor(x1,x2,/ [,out,where,..])按元素计算x1 XOR x2的真值 .

相关问题