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

cpa*_*cpa 238 python numpy slice dataframe pandas

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

目前,我做以下事项:

data = pandas.read_csv('mydata.csv')
Run Code Online (Sandbox Code Playgroud)

这给出了类似的东西:

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Run Code Online (Sandbox Code Playgroud)

我想两个dataframes切片此数据框:一个包含列a,并b和包含列一个c,de.

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

observations = data[:'c']
features = data['c':]
Run Code Online (Sandbox Code Playgroud)

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

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

Ted*_*rou 202

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

请参阅文档中弃用

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

假设我们有以下的列的数据框中:
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
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)

您可以按行和列切片.举例来说,如果你有5列的标签v,w,x,y,z

# slice from 'w' to 'y' and 'foo' to 'ant' by 3
df.loc['w':'y', 'foo':'ant':3]
#    foo ant
# w
# x
# y
Run Code Online (Sandbox Code Playgroud)

  • 现在应该使用`.iloc`,而不是`.loc`.解决这个问题,我会提出它. (3认同)
  • @craned - 这是不正确的。来自 Pandas 文档: .loc 主要是基于标签的,但也可以与布尔数组一起使用。当未找到项目时 .loc 将引发 KeyError。关于 .iloc 也有类似的声明,但它专门指的是基于索引的切片。换句话说,在这个例子中,他使用了基于标签的索引,而 .loc 是正确的选择(基本上是唯一的选择)。例如,如果您想按位置 -rows 5:10 进行切片,则使用 .iloc (2认同)

Kar*_*mel 148

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
Run Code Online (Sandbox Code Playgroud)

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

注意: .ix自Pandas v0.20以来已被弃用.您应该使用.loc.iloc适当地使用.

  • 像`df.ix [:,[0,3,4]]`那样传递多列cab (21认同)
  • 最好使用`loc`而不是`ix`:http://stackoverflow.com/a/31593712/4323 (6认同)
  • 小心熊猫中的范围包括两个端点,即`>>> data.ix [:,'a':'c'] abc 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159` (5认同)
  • 像这样的旧答案需要删除..ix已弃用,绝不应使用. (5认同)
  • @Karmel:上面的输出看起来像是一个复制/粘贴错误.也许你的意思是'df.ix [:,'b':'e']`? (3认同)

jet*_*com 70

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

# Load dataset (pip install seaborn)
>> import seaborn.apionly as sns
>> titanic = sns.load_dataset('titanic')
Run Code Online (Sandbox Code Playgroud)

使用列名称

>> titanic.loc[:,['sex','age','fare']]
Run Code Online (Sandbox Code Playgroud)

使用列索引

>> titanic.iloc[:,[2,3,6]]
Run Code Online (Sandbox Code Playgroud)

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

>> titanic.ix[:,[‘sex’,’age’,’fare’]]
Run Code Online (Sandbox Code Playgroud)

要么

>> titanic.ix[:,[2,3,6]]
Run Code Online (Sandbox Code Playgroud)

使用reindex方法

>> titanic.reindex(columns=['sex','age','fare'])
Run Code Online (Sandbox Code Playgroud)

  • 在pandas 0.20:`.ix`已被弃用. (6认同)

mol*_*ean 35

另外,给定一个DataFrame

数据

在你的例子中,如果你想仅提取a和d列(如第1和第4列),来自pandas数据帧的iloc mothod是你需要的,可以非常有效地使用.您需要知道的是要提取的列的索引.例如:

>>> data.iloc[:,[0,3]]
Run Code Online (Sandbox Code Playgroud)

会给你

          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
Run Code Online (Sandbox Code Playgroud)


Bre*_*ood 25

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

data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
data_ab = data[list('ab')]
data_cde = data[list('cde')]
Run Code Online (Sandbox Code Playgroud)


use*_*507 20

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

op = df[list(df.columns[0:899]) + list(df.columns[3593:])]
print op
Run Code Online (Sandbox Code Playgroud)

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


Sur*_*rya 13

以下是使用不同方法进行选择性列切片的方法,包括基于选择性标签,基于索引和基于选择范围的列切片.

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
Run Code Online (Sandbox Code Playgroud)