web-dev-qa-db-fra.com

Comparaison des flottants dans une colonne pandas

J'ai le dataframe suivant:

       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

J'ai besoin d'ajouter une colonne indiquant où actual_credit> = min_required_credit. Le résultat serait:

       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

Je fais ce qui suit:

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

Cependant, la 3e rangée (0,4 et 0,4) se traduit constamment par False. Après avoir étudié ce problème à divers endroits, notamment: Quelle est la meilleure façon de comparer les flottants pour une quasi-égalité en Python? Je n'arrive toujours pas à faire fonctionner cela. Chaque fois que les deux colonnes ont une valeur identique, le résultat est False, ce qui n'est pas correct.

J'utilise python 3.3

23
darkpool

En raison d'une comparaison flottante imprécise, vous pouvez or votre comparaison avec np.isclose , isclose prend un paramètre de tolérance relatif et absolu donc les éléments suivants devraient fonctionner:

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

En général numpyComparaison les fonctions fonctionnent bien avec pd.Series et permet des comparaisons par élément: isclose, allclose, greater, greater_equal, less, less_equal etc.

Dans ton cas greater_equal ferait:

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

ou bien, comme proposé, en utilisant pandas.ge (alternativement le, gt etc.):

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

Le risque avec oring avec ge (comme mentionné ci-dessus) est que par ex. comparant 3.999999999999 et 4.0 peut renvoyer True qui n'est pas nécessairement ce que vous voulez.

0
Tomasz Bartkowiak