0

假设我有以下数据框:

tmp = np.random.randn(10,4)
df = pd.DataFrame(tmp, index=pd.date_range('1/1/2012', periods=tmp.shape[0]), 
                 columns=['A', 'B', 'C', 'D'])

> b
                   A         B         C         D
2012-01-01  0.471846  1.130041 -0.614117  0.882738
2012-01-02 -1.431566  0.680617 -0.615331  0.288740
2012-01-03  0.398567 -0.115388 -0.869855 -1.273666
2012-01-04  0.379501  0.192329 -1.942184  0.694004
2012-01-05  1.306329 -0.803856  0.417033 -0.655907
2012-01-06 -0.599877  0.696549 -0.252789  1.367977
2012-01-07 -1.618916  0.216571 -0.499880  0.386853
2012-01-08  0.415002  0.139775  0.251842  0.021379
2012-01-09  2.536787  0.737672 -0.740485 -0.890189
2012-01-10 -1.553530 -0.100950 -0.237478 -0.295612

我能怎么做:

  1. 特定行/列的位置索引?(并获取对应的子数据框
  2. 行/列范围的位置索引?(并获取对应的子数据框

对于单项矩阵索引:

例如,假设我想在位置索引子数据帧[1,2](在 numpy “matricial” 表示法中)。输出应该是:

                   C
2012-01-02 -0.615331

我尝试了以下三种方法,但都没有奏效::

df[1,2]
df[1][2]
df.take([1])[2]

唯一有效的方法似乎是:

df.ix[1,2]
df.irow(1)[2]

但:

  • 使用位置索引是危险的,因为如果我的索引是整数(与上述情况中的日期相反),.ix它将默认为标签索引。在此处查看更多信息:开始:停止切片 numpy 和 Pandas 之间的不一致?.

  • 使用irow很麻烦,因为它需要从()符号切换到[]符号(irow返回一个Series对象)

对于范围矩阵索引:

例如,假设我想[1:3,2:3]在(numpy 矩阵符号)中的位置索引元素。输出应该是:

                   B
2012-01-02 -0.615331  
2012-01-03 -0.869855 

请注意,我不包括停止索引(即我坚持使用 numpy 表示法)。

有什么想法吗?

4

3 回答 3

2

这个经常要求的功能很快就会到位 https://github.com/pydata/pandas/pull/2922 如果你想用它进行测试,你可以把它从分支中拉出来

于 2013-02-28T22:00:46.960 回答
2

这是一种解决方法(直到@Jeff 提到的功能请求被提交):

In [178]: df = pd.DataFrame(tmp, index=pd.date_range('2012-1-1', periods=tmp.shape[0]), columns='A B C D'.split())

In [179]: df.ix[df.index[1], df.columns[2]]
Out[179]: -0.3021434106214243

In [180]: df.ix[df.index[1:3], df.columns[2:3]]
Out[180]: 
                   C
2012-01-02 -0.302143
2012-01-03 -1.430387

这表明即使使用打乱的整数索引,语法也以相同的方式工作:

In [206]: df2 = df.reset_index(drop=True)

In [207]: index = range(10)

In [208]: import random

In [209]: random.shuffle(index)

In [210]: df2.index = index

In [212]: df2.ix[df2.index[1], df2.columns[2]]
Out[212]: -0.3021434106214243

In [213]: df2.ix[df2.index[1:3], df2.columns[2:3]]
Out[213]: 
          C
7 -0.302143
2 -1.430387
于 2013-02-28T22:42:56.147 回答
0

来自熊猫文档:

Pandas 提供了一套方法来获得纯粹的基于整数的索引。语义紧跟 python 和 numpy 切片。这些是基于 0 的索引。切片时,包括起始边界,而排除上限。尝试使用非整数,即使是有效标签也会引发 IndexError。

.iloc 属性是主要的访问方法。以下是有效输入:

整数,例如 5 整数列表或数组 [4, 3, 0] 整数 1:7 的切片对象

于 2013-10-11T09:52:53.103 回答