2016-10-21 10 views
6

私は幾分奇妙なの動作をここで感知しています。私は、任意の要素インデックスの文字列のタプルを持つPandas DataFrame

In [15]: df['Col 2'].loc[('1', 'b')] = 6 

In [16]: df 
Out[16]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN  6 NaN 
(2, b) NaN NaN NaN 

の値を設定することができます。しかし、私は、私はちょうど同じ構文を使用して設定する要素を参照するために行くとき、私は

を得る

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=[('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')]) 

In [14]: df 
Out[14]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN NaN NaN 
(2, b) NaN NaN NaN 

のように見えるのデータフレームを持っています
In [17]: df['Col 2'].loc[('1', 'b')] 
KeyError: 'the label [1] is not in the [index]' 

誰かが私が間違っていること、またはこの現象がなぜ起こるのかを教えてもらえますか?インデックスを複数要素タプルとして設定することは許されませんか?

編集どうやら

、リストの作品にタプルインデックスを包みます。これは使用を推奨されていないかどうかを知ることは素晴らしいことだので

In [38]: df['Col 2'].loc[[('1', 'b')]] 
Out[38]: 
(1, b) 6 
Name: Col 2, dtype: object 

私はまだ私の実際のユースケースではいくつかの奇妙な行動を取得していますが。

+1

[この質問](https://stackoverflow.com/questions/25476880/using-dataframe-ix-with-a-tuple-index-in-pandas)での応答はそれはお勧めしません示唆タプルキーとマルチインデックス選択間のあいまいさの使用の原因 –

答えて

4

選択括弧内のタプルは、取得する要素を含むシーケンスとして認識されます。それはあなたが引数として['1', 'b']を渡したようです。したがって、KeyErrorメッセージ:pandasは、鍵'1'を見つけようとしますが、明らかにそれを見つけられません。

これは、大カッコを追加すると動作します。引数が1つの要素(タプル)のシーケンスになるためです。

選択肢のリスト引数とタプル引数のあいまいさを避けるべきです。単純なインデックスまたはマルチインデックスであるインデックスによっても動作が異なる場合があります。

いずれにしても、ここでの推奨事項を尋ねると、タプルで作成された単純なインデックスを作成しないようにする必要があります。パンダは実際にはマルチインデックスを構築すると効果的です代わりに:

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=pd.MultiIndex.from_tuples([('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')])) 

df['Col 2'].loc[('1', 'b')] = 6 

df['Col 2'].loc[('1', 'b')] 
Out[13]: 6 

df 
Out[14]: 
    Col 1 Col 2 Col 3 
1 a NaN NaN NaN 
2 a NaN NaN NaN 
1 b NaN  6 NaN 
2 b NaN NaN NaN 
関連する問題