web-dev-qa-db-ja.com

pandas列のフロートを比較する

次のデータフレームがあります:

       actual_credit    min_required_credit
   0   0.3              0.4
   1   0.5              0.2
   2   0.4              0.4
   3   0.2              0.3

Actual_credit> = min_required_creditの場所を示す列を追加する必要があります。結果は次のようになります。

       actual_credit    min_required_credit   result
   0   0.3              0.4                   False
   1   0.5              0.2                   True
   2   0.4              0.4                   True
   3   0.1              0.3                   False

私は次のことをしています。

df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])

ただし、3行目(0.4および0.4)は常にFalseになります。以下を含むさまざまな場所でこの問題を調査した後 Pythonで浮動小数点数をほぼ等しいかどうかを比較する最良の方法は何ですか? これでも動作しません。 2つの列の値が同じである場合は常に、結果はFalseになり、正しくありません。

私はpython 3.3を使用しています

23
darkpool

フロート比較が不正確なため、ornp.iscloseiscloseは、相対許容誤差と絶対許容誤差のパラメーターを取るため、次のように機能します。

df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
29
EdChum

一般にnumpyComparison 関数はpd.Seriesとうまく機能し、要素ごとの比較を可能にします:iscloseallclosegreatergreater_equallessless_equalなど.

あなたの場合 greater_equal は次のようになります:

df['result'] = np.greater_equal(df['actual_credit'], df['min_required_credit'])

または、提案されているように、 pandas.ge (またはlegtなど)を使用します。

df['result'] = df['actual_credit'].ge(df['min_required_credit'])

oringとgeのリスク(上記のとおり)は、たとえば3.9999999999994.0を比較すると、Trueが返される場合がありますが、これは必ずしも必要なわけではありません。

0