我从CSV文件中加载了一些机器学习数据。前两列是观察结果,其余列是特征。
目前,我做以下事情:
data = pandas.read_csv('mydata.csv')
它会给出如下内容:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
我想把这个数据帧切成两个数据帧:一个包含列a和b,一个包含列c, d和e。
不可能写出这样的东西
observations = data[:'c']
features = data['c':]
我不确定最好的方法是什么。我需要一个pd.Panel吗?
顺便说一下,我发现数据帧索引非常不一致:数据['a']是允许的,但数据[0]是不允许的。另一方面,数据['a':]是不允许的,但数据[0:]是允许的。
这有什么实际的原因吗?如果列以Int为索引,这真的很令人困惑,给定data[0] != data[0:1]
2017答案- pandas 0.20: .ix已弃用。使用.loc
请参阅文档中的弃用部分
.loc使用基于标签的索引来选择行和列。标签是索引或列的值。使用.loc进行切片包括最后一个元素。
让我们假设我们有一个包含以下列的DataFrame:
Foo, bar, quz, ant, cat, sit, 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行,标签是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