2 votes

Numpy Where Multiple Conditions , ne peut pas comparer un tableau dtypé [object] avec un scalaire de type [bool].

J'essaie de faire des conditions multiples dans un where numpy mais j'obtiens l'erreur : cannot compare a dtyped [object] array with a scalar of type [bool]

Voici la ligne :

d7['CAD'] = np.where(d7['Category'] == 'Stack' & d7['Currency'] == fxratetable['from_currency'],d7['CAD'] * fxratetable['fx_rate'], d7['CAD'])

Tous dtypes sont object sauf pour fx_rate qui est float64 .

Une autre idée est que je recherche une valeur avec Category = Stack mais je cherche des valeurs multiples avec mon Currency = from_currency .

Quelqu'un peut-il m'aider ?

Gracias.

nouvelle erreur

ValueError: Can only compare identically-labeled Series objects now. 

Voici ma nouvelle déclaration

d7['CAD'] = np.where((d7['Category'] == 'Stack') & 
                     (d7['Currency'] == fxratetable['from_currency']),
                     d7['CAD'] * fxratetable['fx_rate'], 
                     d7['CAD'])

d7 :

+--------------+----------+----------+
| CAD          | Currency | Category |
+--------------+----------+----------+
| -4350242.355 | GBP      | Stack    |
+--------------+----------+----------+
| 424223.7584  | AUD      | Stack    |
+--------------+----------+----------+

fxratetable :

+---------------+---------+
| from_currency | fx_rate |
+---------------+---------+
| GBP           | 1.367   |
+---------------+---------+
| AUD           | 0.7706  |
+---------------+---------+

Nouvelle colonne CAO attendue.

+----------------+
| CAD (expected) |
+----------------+
| -5948957.275   |
+----------------+
| 326991.5663    |
+----------------+

1voto

LiamFiddler Points 605

Le problème se situe au niveau de la deuxième partie de l'expression booléenne. On peut supposer que d7 est plus que deux rangées, sinon il n'y aurait pas ce problème. d7['Currency'] == fxratetable['from_currency'] compare les deux séries rangée par rangée, et quand les rangées sont à court de fxratetable il ne sait pas quoi comparer d7 de plus.

Je ne sais pas si vous avez décidé d'utiliser NumPy ou s'il y a des limites à ce que vous pouvez faire, mais une déclaration de fusion permettrait de gérer cela très facilement :

# Merge the exchange rate
d7 = pd.merge(d7, fxratetable, left_on='Currency', right_on='from_currency', how='left')
# Find the rows which have a non-NaN exchange rate and multiply
d7['CAD'] = np.where(~np.isnan(d7['fx_rate']), d7['CAD']*d7['fx_rate'], d7['CAD'])

1voto

lbd Points 236

Je préfère personnellement DataFrame.apply lorsqu'il s'agit de conditions.

d7['CAD'] = d7.apply(lambda row: row.CAD * fxratetable[fxratetable.from_currency == row.Currency].fx_rate.item() \
                                 if row.Category == 'Stack' else row.CAD, axis=1)

fxratetable[fxratetable.from_currency == row.Currency] sélectionne la ligne dans fxratetable qui correspond à la bonne devise, .fx_rate sélectionne la colonne des taux, et .item() donne le numéro, au lieu d'une série.

Vous pouvez voir que seul le row.Category == 'Stack' La condition demeure, la comparaison problématique des séries fait maintenant partie de la sélection.

Et enfin, axis=1 est utilisé pour appliquer la fonction aux lignes du DataFrame ( document ).

Je ne l'ai pas testé de manière approfondie, alors faites-moi savoir si cela fonctionne.

1voto

Lumber Jack Points 496

Je pense que ce sera ce que vous attendiez. Je l'ai écrit d'une manière compréhensible.

d7 = pd.DataFrame({'CAD':[-4350242.355,424223.7584],'Currency':['GBP','AUD'],'Category':['Stack','Stack']})
fxratetable = pd.DataFrame({'from_currency':['GBP','AUD'],'fx_rate':[1.367,0.7706 ]})
_condition1 = d7['Category'] == 'Stack'
_condition2 = d7['Currency'] == fxratetable['from_currency']
d7['CAD (expected)'] = np.where(_condition1 & _condition2,d7['CAD'] * fxratetable['fx_rate'],d7['CAD'])
d7

SORTIE enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X