冒号(:)在python中的工作原理&;熊猫?
我创建一个数据帧:冒号(:)在python中的工作原理&;熊猫?,python,pandas,Python,Pandas,我创建一个数据帧: import pandas as pd data = pd.DataFrame({'a':range(1,11),'b':['m','f','m','m','m','f','m','f','f','f'],'c':np.random.randn(10)}) 这看起来像: a b c 0 1 m 0.495439 1 2 f 1.444694 2 3 m 0.150637 3 4 m -1.078252 4 5 m
import pandas as pd
data = pd.DataFrame({'a':range(1,11),'b':['m','f','m','m','m','f','m','f','f','f'],'c':np.random.randn(10)})
这看起来像:
a b c
0 1 m 0.495439
1 2 f 1.444694
2 3 m 0.150637
3 4 m -1.078252
4 5 m 0.618045
5 6 f -0.525368
6 7 m 0.188912
7 8 f 0.159014
8 9 f 0.536495
9 10 f 0.874598
当我想选择一些行时,我运行
data[:2] or data.ix[2]
但当我尝试时:
se = range(2)
data[se]
有一个错误:
KeyError: 'No column(s) named: [0 1]'
我知道DataFrame选择一个列作为默认值。当我运行data[se]
时发生了什么?
冒号(:)在python中是如何工作的?我从未使用过Pandas,但是可以找到python中切片(
[::]
符号)的一个很好的解释
在DataFrame中,[]的内部切片会对行进行切片。这主要是为了方便起见,因为这是一种常见的操作
In [32]: df[:3]
Out[32]:
A B C D
2000-01-01 -0.282863 0.469112 -1.509059 -1.135632
2000-01-02 -0.173215 1.212112 0.119209 -1.044236
2000-01-03 -2.104569 -0.861849 -0.494929 1.071804
In [33]: df[::-1]
Out[33]:
A B C D
2000-01-08 -1.157892 -0.370647 -1.344312 0.844885
2000-01-07 0.577046 0.404705 -1.715002 -1.039268
2000-01-06 0.113648 -0.673690 -1.478427 0.524988
2000-01-05 0.567020 -0.424972 0.276232 -1.087401
2000-01-04 -0.706771 0.721555 -1.039575 0.271860
2000-01-03 -2.104569 -0.861849 -0.494929 1.071804
2000-01-02 -0.173215 1.212112 0.119209 -1.044236
2000-01-01 -0.282863 0.469112 -1.509059 -1.135632
在您的示例中,您使用范围(2)
将[0,1]
作为列表。我认为您需要的是数据[0:1]
对数据帧进行切片,并获得与数据[:1]
相同的第0行和第1行,省略零。例如,如果您需要第3、4和5行,则为数据[3:5]
此外,查看手册中的一些示例,您可以使用步骤,因此:
数据[::2]
每第二行提供一次
data[:-1]
按相反顺序返回所有行
- 组合范围和步长:
数据[0:10:2]
将产生第0、2、4、6、8和10行
希望它能有所帮助,这种[start:limit:step]语法被称为切片。
您可以使用以下函数轻松创建切片的实例:
类片(停止)
类切片(开始、停止[、步骤])
返回表示由指定的索引集的切片对象
范围(开始、停止、步骤)。开始和步骤参数默认为
无。切片对象具有只读数据属性“开始”、“停止”和“结束”
只返回参数值(或其默认值)的步骤
没有其他明确的功能;但是
数值Python和其他第三方扩展
使用扩展索引语法时也会生成。例如:
[start:stop:step]或[start:stop,i]。有关详细信息,请参阅itertools.islice()
返回迭代器的备用版本
在您的情况下,可以编写类似这样的内容来返回前两行
se = slice(None, 2)
data[se]
提供一个列表试图从列中进行选择(您没有名称为0或1的列),同时提供一个类似:2
的切片来切片行。如果我想选择这些行[2,4,3,5,1],我运行df[slice([2,4,3,5,1]),有一个错误。我只是使用了df.ix[2,4,3,5,1]。有其他方法吗?您需要按顺序排列吗?您只能使用[]
进行单个范围的排列,并且不能更改顺序,只能跳过行或反转(据我所知)。执行df[1:5]
应该可以给您所需的行,但不能按您想要的顺序排列……但是,当我执行df[1:2]时我只得到行索引1,而不是1和2。我缺少什么?[至少在其他编程语言中,1:2表示行(或列)1和2。
>>> data.ix[range(2)]
a b c
0 1 m -0.323834
1 2 f 0.159787