2017-10-19 6 views
0

私は自分のコードに非常に微妙なバグを発見しました。私は頻繁に分析のデータフレームから行を削除します。これは、インデックスのギャップを残しますので、私はいけない場合、私は、私はしかしインデックスをリセットするのはいつですか? loc vs iloc(インデックスのギャップ)?ベストプラクティス?

for row in xrange (df0.shape [0]): 
    print df0.loc [row] 
    print df0.iloc [row] 

と次の機能に引き続き次に

df0 = df0.reset_index (drop = True) 

で終わりでインデックスをリセットすることにより、すべての機能を終了してみてくださいインデックスを正しくリセットすると、最初の行のインデックスは192になる可能性があります。192のインデックスは行番号0と同じではありません。これにより、df0.loc [row]がインデックス0の行にアクセスし、 df0.iloc [row]がインデックス192を持つ行にアクセスしています。これは非常に奇妙なバグを引き起こしました。行0を更新しようとすると、代わりにインデックス192が更新されます。またはその逆。

しかし実際には、私はdf0.loc()またはdf0.iloc()関数を使用しません。遅すぎるためです。私のコードは、値にアクセスするときの最も速い関数なので、df0.get_value(...)関数とdf0.set_value(...)関数ではじまります。

そして、関数のいくつかはインデックスでアクセスされ、その他は行番号でアクセスされるようです。私は混乱しています。誰かが私に説明することはできますか?ベストプラクティスは何ですか?いくつかの関数はインデックスを使って値にアクセスし、他の関数は行番号を使用していますか?私は何かを誤解したことがありますか?私はいつもreset_index()をできるだけ頻繁に行うべきですか?それとも決してしないの?

編集:要約すると:私は手作業でいくつかの行をマージして、指標に隙間ができるようにします。他の関数では、各行を繰り返し計算します。ただし、インデックスをリセットしても、インデックスをリセットしないと他の計算結果が表示されます。どうして?それが私の問題です。

+0

ilocは、インデックスラベルの内容に関係なく動作します。 iloc(整数位置)は、インデックス内の整数位置に基づいて行を取得します。 –

答えて

1

.loc[]インデックスのラベルを参照してください。これは整数値であってもなくてもかまいません。

  • あなたのインデックスが[0, 1, 3](非連続整数インデックス)であれば何のインデックスラベル2がないため、.loc[2]は、何かを見つけることができません。
  • 同様に、インデックスが['a', 'b', 'c'](非整数インデックス)の場合は、.loc[2]が空になります。

.iloc[]はインデックスで常に整数値になります位置を、見えます。

  • あなたのインデックスが[0, 1, 3]であれば、.loc[2]3に対応する行を返します。
  • インデックスが['a', 'b', 'c']の場合、.loc[2]'c'に対応する行を返します。

これはバグではなく、そうしたインデクサーの設計方法です。目的に合っているかどうかは、データの構造と達成しようとしているものによって異なります。それ以上のことを知らずに推薦をするのは難しいです。

つまり、あなたのコードが厄介なものになっているように聞こえます。reset_index()をさまざまな場所で実行し、どの行を更新しようとしているのかを常に把握しておくことで、Pandasの多くの行と列を一度にベクトルベースの計算を実行する能力を活用できない可能性があります。おそらくあなたが達成したい課題は、これを避けられないものにします。しかし、一度に1つずつ個別のセルで操作するのではなく、データフレーム全体またはデータフレームのサブセットに適用できるように、作業の一部をベクトル化できないかどうかを検討するのに時間をかけておく価値があります。

+0

あなたの答えをありがとう。私はあなたが今説明したことを知っています、loc()はラベルを見て、ilocはindiciesを見ます。 私はコードをベクトル化できません、私は各セルを見て、他の条件の多くに応じて複雑な計算を行う必要があります。私は頻繁にいくつかの複雑な条件を介して1つにいくつかの行をマージし、私は私がマージした行を追跡し、それらの関数の最後に削除します。しかし、インデックスが乱れてリセットする必要があります。私のすべての身元証明書はデフォルトの番号ですが、私は身分証明書を通常のインデックス列よりも別の列に変更していません。私は混乱しています。 –

+0

私はあなたの問題を誤解したと思います。 '.iloc'と' .loc'が異なる結果を出す理由と理由を知っているなら、あなたはなぜ「私がインデックスをリセットすれば、私はインデックスをリセットしないと他の計算結果が得られますか?たぶん、あなたはあなたが持っている問題について、あなたが得ているものと期待される結果がどのように異なるかについて、より具体的にすることができます。 – ASGM

関連する問題