冒号(:)如何在python&中工作熊猫吗?

时间:2015-12-17 08:13:42

标签: python pandas

我创建了一个DataFrame:

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选择col作为默认值。当我运行data[se]时发生了什么? 冒号(:)如何在python中运行?

3 个答案:

答案 0 :(得分:4)

我从未使用过Pandas,但是可以找到切片的一个很好的解释([::]符号在python中here。现在我从manual

中读到的内容
  

使用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

在您使用range(2)的示例中,[0, 1]列表。我认为您需要data[0:1]来对DataFrame进行切片,并获得与省略零的data[:1]相同的行0和1。如果你想要例如第3,4和5行data[3:5]

此外,查看手册中的一些示例,您可以使用步骤,因此:

  • data[::2]为您提供第2行
  • data[::-1]以相反的顺序返回所有行
  • 组合范围和步骤:data[0:10:2]将产生行0,2,4,6,8和10

希望有所帮助

答案 1 :(得分:2)

[start:limit:step]语法称为切片。 您可以使用slice()函数轻松创建切片实例:

  

类切片(停止)

     

类切片(开始,停止[,步骤])

     

返回表示由指定的索引集的切片对象   范围(开始,停止,步骤)。 start和step参数默认为   没有。切片对象具有只读数据属性start,stop和   仅返回参数值(或其默认值)的步骤。他们   没有其他明确的功能;但它们被用于   数值Python和其他第三方扩展。切片对象是   在使用扩展索引语法时也会生成。例如:   a [开始:停止:步骤]或[开始:停止,我]。请参阅itertools.islice()获取   返回迭代器的备用版本。

在你的情况下,你可以写这样的东西来返回前两行

se = slice(None, 2)
data[se]

答案 2 :(得分:1)

>>> data.ix[range(2)]
   a  b         c
0  1  m -0.323834
1  2  f  0.159787