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
?
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
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.