2016-03-24 7 views
2

だが、私はパンダSeriesを持っている、と私はそうのように、特定のインデックスで要素のセットにアクセスしたいとしましょうパラメータとして:パンダインデクサ方法とタプル

In [1]: 
from pandas import Series 
import numpy as np 

s = Series(np.arange(0,10)) 

In [2]: s.loc[[3,7]] 

Out[2]: 
3 3 
7 7 
dtype: int64 

.locメソッドは、パラメータとしてlistを受け入れますこのタイプの選択のために。 .iloc.ixの方法は同じ方法で動作します。

私はパラメータにtupleを使用する場合は、.loc.iloc両方が失敗した:

In [5]: s.loc[(3,7)] 
--------------------------------------------------------------------------- 
IndexingError        Traceback (most recent call last) 
........ 
IndexingError: Too many indexers 

In [6]: s.iloc[(3,7)] 
--------------------------------------------------------------------------- 
IndexingError        Traceback (most recent call last) 
........ 

IndexingError: Too many indexers 

そして.ixは奇妙な結果生成:今

In [7]: s.ix[(3,7)] 
Out[7]: 3 

を、私は「あなたができることを得ます生のpythonでこれを行うこともできますlist

listから特定のインデックスのセットを取得するには、理解度、as explained hereを使用する必要があります。

しかし一方で、tupleを使用してパンダの行を選択すると、DataFrameは3つのすべてのインデックス作成方法で問題なく動作しているようです。ここで.loc方法の例です:

In [8]: 
from pandas import DataFrame 
df = DataFrame({"x" : np.arange(0,10)}) 

In [9]: 
df.loc[(3,7),"x"] 

Out[9]: 
3 3 
7 7 
Name: x, dtype: int64 

私の3つの質問があります:

  • はなぜSeriesインデクサはtupleを受け入れていないのだろうか?所望のインデックスのセットが
    不変の一回使用パラメータであるので、tupleを使用することは自然に
    と思われる。これは の目的のためだけにlistインターフェイスを模倣していますか?
  • 奇妙な説明は何ですかSeries.ix結果はありますか?
  • なぜこの問題に関してSeriesDataFrameの間に矛盾があるのですか?

答えて

2

最初の質問に対する答えは、tuplesMultiIndexに配置されていると思います。 2番目の2つの質問に対する良い答えはないと思いますが、コード内にそれぞれバグと不一致があります(これは難しいことではありません:))。 Seriesには、 MultiIndexがないか、またはより一般的には、タプルの長さがインデックスのレベル数よりも大きいために不平を言っています。 DataFrameはおそらく同じように反応するはずですが、そうではありません。 MultiIndexの場合はtuplesを予約し、複数の行をインデックスする場合はリスト/アレイ/シリーズを使用するのが最も安全な方法だと思います。 補足として、タプルのリスト/配列を使用して、MultiIndexの複数の行を選択します。

2

それは体系的な方法でこれに答えるのは難しいので、私はちょうどリストスタイルにお答えします:

  1. を、私は大きな疑問が正確に何をしようとするかもしれないと思うけどにできませんか?私。 []が標準の方法の場合、[]の代わりに()を使用する理由は何ですか?
  2. あなたの最初の質問は、なぜ構文が特定の方法であるのかということだけです。パンダだけでなくnumpyの歴史にも深く関わっていなければ、答えはほとんど不可能な質問です。いずれにしても、@ JoeCondronの簡単な答えは正しいです:タプルはマルチインデックス用で、リストは高度なインデックス作成用です(別名「ファンシーインデックス」)。私はファンシーなインデックス作成が厄介なものから直接持ち上げられ、マルチインデックスがパンダによって追加されたと信じています。
  3. これは矛盾していると思いますが、SeriesとDataFramesはまったく同じものではありませんので、その動作が100%一貫していることは実際には不可能です。特に、DataFrameのインデックス作成では、行と列を区別するための余分な機械が必要ですが、Seriesでは行についての心配がありません。
  4. 非常に一般的な意味であなたの質問に答えるために、ここでは、非標準的な構文を使用すると、かもしれないかもしれないが、かもしれませんが、だから、df.locがここで働いていて、s.locはそうではないと言うのは公正だとは思わない。どちらも、(文書によると)ここで働くことは保証されていませんでしたが、df.locが起きました。さらに、df.locはこれ以降のバージョンではこのように動作しなくなる可能性があります。
  5. 例のように動作しないloc/iloc/ixの例は、指摘してバグとして報告する必要があります。私は上記のカテゴリのどれにも該当しないと信じていますが、確かに間違っている可能性があります。
+0

すべてに同意します。あなたの最初の質問に答えるために、私がしようとしているのは、私が自然だと思う構文を使うことだけです。インデックス番号の特定のセットは物事が得られるほど不変であると考えられ、「タプル」は理にかなっています。私がタプルを使うことができないのは、世界の終わりではなく、特に私はそれを諦めていません。結局、それをやり遂げることができなくても、私の好奇心を引き起こすほど私を挫折させることはありませんでした。 –

+0

偉大な答え。 's.ix [(3、7)]'が '3 'を返すのはバグだと主張したいと思います。どのようにこれが意図された行動になるのか想像がつきません。予想外のインプットがパンダでうまく処理されないことがあると思います。 – JoeCondron

+0

@JoeCondronはい、良い点!あなたと全く同意します。 – JohnE

関連する問題