2

同等であると思われる pandas コードのスニペットが 2 つありますが、2 番目のスニペットは期待どおりの動作をしません。

# snippet 1
    data = all_data[[((np.isfinite(all_data[self.design_metric][i]) 
                    and all_data['Source'][i] == 2)) 
                    or ((np.isfinite(all_data[self.actual_metric][i]) 
                    and all_data['Source'][i] != 2))
                    for i in range(len(all_data))]]


# snippet 2
    data = all_data[(all_data['Source'] == 2 &
                    np.isfinite(all_data[self.design_metric])) |
                    (all_data['Source'] != 2 &
                    np.isfinite(all_data[self.actual_metric]))]

各セクション (例: all_data['Source'] == 2) は、それ自体で期待どおりの動作をしますが、最終結果がリスト内包版とは異なる結果になるため、論理演算子に何か問題があるようです。

4

2 に答える 2

10

演算子は(または任意の比較演算子)より&も厳密にバインドします。ドキュメント==を参照してください。より簡単な例は次のとおりです。

>>> 2 == 2 & 3 == 3
False

これは、 としてグループ化され2 == (2 & 3) == 3、比較チェーンが呼び出されるためです。これがあなたの場合に起こっていることです。各比較を括弧で囲む必要があります。

 data = all_data[((all_data['Source'] == 2) &
                np.isfinite(all_data[self.design_metric])) |
                ((all_data['Source'] != 2) &
                np.isfinite(all_data[self.actual_metric]))]

==との!=比較を囲む余分な括弧に注意してください。

于 2013-10-25T05:17:19.357 に答える