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の「マトリックス」表記で)。出力は次のようになります。

                   C
2012-01-02 -0.615331

次の3つの方法を試しましたが、どれもうまくいきませんでした::

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

機能する唯一の方法は次のとおりです。

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

しかし:

  • 私のインデックスが整数である場合(上記の場合の日付とは対照的に)、ラベルのインデックス付け.ixがデフォルトになるため、位置インデックス付けに使用するのは危険です。詳細については、こちらを参照してください: Start:stop slicing inconsistencies between numpy and Pandas? .

  • 表記から表記にirow切り替える必要があるため、使用が面倒です(オブジェクトを返します)()[]irowSeries

範囲行列索引付けの場合:

たとえば[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/2922u でテストしたい場合は、ブランチからそれを引き出すことができます

于 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 に答える