web-dev-qa-db-fra.com

Comment sélectionner des lignes dans un DataFrame entre deux valeurs, en Python Pandas?

J'essaie de modifier une variable __ DataFrame df pour qu'elle ne contienne que les lignes pour lesquelles les valeurs de la colonne closing_price sont comprises entre 99 et 101 et j'essaie de le faire avec le code ci-dessous. 

Cependant, j'ai l'erreur 

ValueError: la valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool (), a.item (), a.any () ou a.all ()

et je me demande s’il existe un moyen de le faire sans utiliser de boucles.

df = df[(99 <= df['closing_price'] <= 101)]
47
user131983

Vous devriez utiliser () pour regrouper votre vecteur booléen afin de lever les ambiguïtés. 

df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]
48
Jianxun Li

Considérez aussi les séries entre :

df = df[df['closing_price'].between(99, 101, inclusive=True)]
63
Parfait

il existe une alternative plus intéressante - utilisez query () method:

In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)})

In [59]: df
Out[59]:
   closing_price
0            104
1             99
2             98
3             95
4            103
5            101
6            101
7             99
8             95
9             96

In [60]: df.query('99 <= closing_price <= 101')
Out[60]:
   closing_price
1             99
5            101
6            101
7             99

UPDATE: répondant au commentaire:

J'aime la syntaxe ici, mais je suis tombé en essayant de combiner avec expresison; df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')

In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\
     ...:       " <= closing_price <= " + \
     ...:       "(closing_price.mean() + 2*closing_price.std())"
     ...:

In [162]: df.query(qry)
Out[162]:
   closing_price
0             97
1            101
2             97
3             95
4            100
5             99
6            100
7            101
8             99
9             95
16
MaxU
newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')

ou 

mean = closing_price.mean()
std = closing_price.std()

newdf = df.query('@mean <= closing_price <= @std')
4
crashMOGWAI

vous pouvez également utiliser la méthode .between()

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")

emp[emp["Salary"].between(60000, 61000)]

Sortie

 enter image description here

2
Riz.Khan

Au lieu de cela 

df = df[(99 <= df['closing_price'] <= 101)]

Vous devriez utiliser ceci

df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]

Nous devons utiliser les opérateurs logiques bitwise |, &, ~, ^ de NumPy pour les requêtes composées . De plus, les parenthèses sont importantes pour la priorité des opérateurs.

Pour plus d'informations, vous pouvez visiter le lien: Comparaisons, masques et logique booléenne

0
Rushabh Agarwal

Si vous utilisez plusieurs valeurs et plusieurs entrées, vous pouvez également configurer une fonction d’application comme celle-ci. Dans ce cas, filtrer une trame de données pour les positions GPS correspondant à certaines plages.

def filter_values(lat,lon):
    if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01:
        return True
    Elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01:
        return True
    else:
        return False


df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]
0
sparrow