J'ai le jeu de données suivant:

Ensemble de données de début :

ObjectID,Date,Price,Vol,Mx
101,2017-01-01,,145,203
101,2017-01-02,,155,163
101,2017-01-03,67.0,140,234
101,2017-01-04,78.0,130,182
101,2017-01-05,58.0,178,202
101,2017-01-06,53.0,134,204
101,2017-01-07,52.0,134,183
101,2017-01-08,62.0,148,176
101,2017-01-09,42.0,152,193
101,2017-01-10,80.0,137,150

Je crée d'abord deux nouvelles colonnes de valeurs booléennes appelées VolPrice et Check en fonction des valeurs de mon ensemble de données de départ. Je pense que je veux créer une troisième colonne supplémentaire appelée DoubleCheck où la valeur de cette colonne doit être True si VolPrice OU Check sont égaux à True, sinon la valeur de DoubleCheck doit être false. Au départ, j'ai l'erreur suivante :

ValueError: la valeur de vérité d'un tableau avec plusieurs éléments est ambiguë. Utilisez a.any () ou a.all ()

Mais ensuite j'ai ajouté .any() après chaque colonne dans ma déclaration pour construire la colonne DoubleCheck. Cependant, cela ne fonctionne pas non plus car il fournit des valeurs « True » dans toute la colonne DoubleCheck, même lorsqu'il devrait y avoir des valeurs fausses, comme indiqué ci-dessous.

Code:

import pandas as pd
import numpy as np

Observations = pd.read_csv("C:\\Users\\Observations.csv", parse_dates=['Date'], index_col=['ObjectID', 'Date'])

Observations['VolPrice'] = np.where((Observations['Price']<Observations['Vol']) & (Observations['Vol']<Observations['Mx']), True, False)
Observations['Check'] = np.where(Observations['Vol']<Observations['Price'], True, False)
Observations['DoubleCheck'] = np.where((Observations['Check'].any()==True) or (Observations['VolPrice'].any()==True), True, False)

print(Observations)

Résultat actuel:

ObjectID,Date,Price,Vol,Mx,VolPrice,Check,DoubleCheck
101,2017-01-01,,145,203,False,False,True
101,2017-01-02,,155,163,False,False,True
101,2017-01-03,67.0,140,234,True,False,True
101,2017-01-04,78.0,130,182,True,False,True
101,2017-01-05,58.0,178,202,True,False,True
101,2017-01-06,53.0,134,204,True,False,True
101,2017-01-07,52.0,134,183,True,False,True
101,2017-01-08,62.0,148,176,True,False,True
101,2017-01-09,42.0,152,193,True,False,True
101,2017-01-10,80.0,137,150,True,False,True

Résultat désiré:

ObjectID,Date,Price,Vol,Mx,VolPrice,Check,DoubleCheck
101,2017-01-01,,145,203,False,False,False
101,2017-01-02,,155,163,False,False,False
101,2017-01-03,67.0,140,234,True,False,True
101,2017-01-04,78.0,130,182,True,False,True
101,2017-01-05,58.0,178,202,True,False,True
101,2017-01-06,53.0,134,204,True,False,True
101,2017-01-07,52.0,134,183,True,False,True
101,2017-01-08,62.0,148,176,True,False,True
101,2017-01-09,42.0,152,193,True,False,True
101,2017-01-10,80.0,137,150,True,False,True
2
cfadr2021 13 oct. 2020 à 14:32

1 réponse

Meilleure réponse

Utilisez | pour OR au niveau du bit, en fonctionnant de la même manière que & pour le bit AND :

Observations['DoubleCheck'] = Observations['Check'] | Observations['VolPrice']

Ou DataFrame.any avec les deux colonnes :

Observations['DoubleCheck'] = Observations[['Check','VolPrice']].any(axis=1)

Tous ensemble est possible sans np.where :

Observations['VolPrice'] = (Observations['Price']<Observations['Vol']) & (Observations['Vol']<Observations['Mx'])
Observations['Check'] = Observations['Vol']<Observations['Price']
Observations['DoubleCheck'] = Observations['Check'] | Observations['VolPrice']
1
jezrael 13 oct. 2020 à 11:34