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
,d
和e
.
写不出类似的东西是不可能的
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
.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)
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
适当地使用.
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)
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)
归档时间: |
|
查看次数: |
405387 次 |
最近记录: |