2017-02-21 8 views
0

私は(初期インデックス0 ... 9999で)データフレームを撮影し、そのように今年で仕切られています:パンダインデックスが予期せずに動作します。df [df.indexを[0] => KeyError例外

requests_df = {year : df[df['req_year'] == year] for year in df['req_year'].unique()} 

として、通常、各サブフレームはそれ自身のインデックス順序を保持する。その後、私はこれは本当に予期しない動作を取得これらの単離されたフレームの1つ(df_yr = requests_df[2015])上のインデックスにしようとしているとき:

for idx in df_year.index: 
     qty = frame[idx]['qty_tickets'] 

原因:私はイテレータにgoofed

KeyError         Traceback (most recent call last) 
/home/user/ve/ml/lib/python3.5/site-packages/pandas/indexes/base.py in get_loc(self, key, method, tolerance) 
    2133    try: 
-> 2134     return self._engine.get_loc(key) 
    2135    except KeyError: 

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4433)() 

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4279)() 

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13742)() 

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13696)() 

KeyError: 8666 

思考を、私は単純なケースを試してみました:

df_yr[df_yr.index[0]]

KeyError 

ワット。

8666は間違いなく最初の行のインデックス値である:私は正常に動作し、df.index値に依存してLOCを用い

Int64Index([8666, 8667, 8668, 8669, 8670, 8671, 8672, 8673, 8674, 8675, 
      ... 
      9830, 9831, 9832, 9833, 9834, 9835, 9836, 9837, 9838, 9839], 
      dtype='int64', length=1174) 

インデックス、

outframe.loc[8666] 

wat。

df.ixはまた、内蔵のフォールバックを持っているとして、すぎ驚くべきことではないされ、動作します。

私は何の問題もなく、時間のdf.index数十の操作を使用して索引付けしました。何がありますか?

+3

'qty = frame [idx] ['qty_tickets']'を 'qty = frame 'に変更してみてください。loc [idx、 'qty_tickets'] ' – jezrael

+1

' df [i] 'は、デフォルトで列ラベルベースのインデックスを実行します。 'df.loc [i]'と 'df.ix [i]'の両方が行の索引付けを行います。 –

+0

@IgorRaushあなたは私に私の方法のエラーを見せました!私は、 'df [2:4]'のようなスライスがうまくいくと思っていたので、単純な行を忘れてしまったので( 'df [' foo '] ==' bar ''stuff) dfが既にマスクされた後に索引付けが失敗します。これを回答として投稿しても構いませんか? – DeusXMachina

答えて

1

通常、df[index]は、列ラベルベースのインデックスを実行します。あなたが気づいたように、例外は

  • df[slice]は、これら2つの例外よりも

他のマスクに基づいて行のサブセットを選択します行

  • df[boolean_mask]
  • をスライスしますが、明確にするために何の効果的な方法はありません df[row_label]df[col_label]のように、パンダは後者の解釈を使用します。なぜなら、それは「辞書的な」データフレームに一貫しているからです。 df_yr[df_yr.index[0]]を使用した実験では、列インデックスラベルが必要な行インデックスラベルを使用しようとしているため、エラーが発生しました。

    代わりに、構文はcol_indexerはオプションで

    df.loc[row_indexer, col_indexer] 
    

    された多軸ラベルベースのインデックスを、使用。 df.loc[df.index[0]]はうまく動作するはずです。コードの壊れた部分には、

    frame.loc[idx, 'qty_tickets'] 
    

    (これもnoted by jezrael in the commentsです)を使用してください。

    関連する問題