web-dev-qa-db-fra.com

Erreur: la valeur de vérité d'une série est ambiguë - Python pandas

Je sais cependant que cette question a déjà été posée lorsque j'essaie de faire une déclaration if et que je reçois une erreur. J'ai regardé ce link , mais ne m'a pas beaucoup aidé dans mon cas. Ma dfs est une liste de DataFrames. 

J'essaye ce qui suit,

for i in dfs:
    if (i['var1'] < 3.000):
       print(i)

Donne l'erreur suivante:

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 J'ai essayé ce qui suit et j'ai obtenu la même erreur.

for i,j in enumerate(dfs):
    if (j['var1'] < 3.000):
       print(i)

Mon type de données var1 est float32. Je n'utilise aucun autre opérateur logical et & ou |. Dans le lien ci-dessus, cela semblait être dû à l'utilisation d'opérateurs logiques. Pourquoi ai-je ValueError?

5
i.n.n.m

Voici une petite démo, qui montre pourquoi c'est arrivé:

In [131]: df = pd.DataFrame(np.random.randint(0,20,(5,2)), columns=list('AB'))

In [132]: df
Out[132]:
    A   B
0   3  11
1   0  16
2  16   1
3   2  11
4  18  15

In [133]: res = df['A'] > 10

In [134]: res
Out[134]:
0    False
1    False
2     True
3    False
4     True
Name: A, dtype: bool

lorsque nous essayons de vérifier si une telle série est True - Les Pandas ne savent pas quoi faire:

In [135]: if res:
     ...:     print(df)
     ...:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
...
skipped
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Solutions de contournement:

nous pouvons décider comment traiter une série de valeurs booléennes - par exemple, if doit renvoyer True si all les valeurs sont True:

In [136]: res.all()
Out[136]: False

ou quand au moins une valeur est vraie:

In [137]: res.any()
Out[137]: True

In [138]: if res.any():
     ...:     print(df)
     ...:
    A   B
0   3  11
1   0  16
2  16   1
3   2  11
4  18  15
6
MaxU

Actuellement, vous sélectionnez la série entière à des fins de comparaison. Pour obtenir une valeur individuelle de la série, vous souhaiterez utiliser quelque chose comme:

for i in dfs:
if (i['var1'].iloc[0] < 3.000):
   print(i)

Pour comparer chacun des éléments individuels, vous pouvez utiliser series.iteritems (la documentation est réduite sur celui-ci) comme ceci:

for i in dfs:
    for _, v in i['var1'].iteritems():
        if v < 3.000:
            print(v)

Dans la plupart des cas, la meilleure solution consiste à sélectionner un sous-ensemble du cadre de données à utiliser pour tout ce dont vous avez besoin, comme ceci:

for i in dfs:
    subset = i[i['var1'] < 3.000]
    # do something with the subset

Les performances dans les pandas sont beaucoup plus rapides sur les grandes trames de données lorsque vous utilisez des opérations en série au lieu d’itérer des valeurs individuelles. Pour plus de détails, vous pouvez consulter les pandas documentation sur la sélection.

2
Gasvom