2015-01-06 19 views
6

Ho continuato a ricevere ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). durante i test booleani con i panda. Non capendo cosa diceva, ho deciso di provare a capirlo.Pandas Boolean .any() .all()

Tuttavia, sono totalmente confuso a questo punto.

Qui creo un dataframe di due variabili, con un unico punto di dati condivisi tra loro (3):

In [75]: 

import pandas as pd 

df = pd.DataFrame() 

df['x'] = [1,2,3] 
df['y'] = [3,4,5] 

Ora cerco tutti (sia x meno y), che traduco alla "sono tutti i valori di x meno di y ", e ottengo una risposta che non ha senso.

In [79]: 

if all(df['x'] < df['y']): 
    print('True') 
else: 
    print('False') 
True 

Poi ho provato nessuno (è x meno y), che traduco a "è un qualsiasi valore di x meno di y", e ottengo un'altra risposta che non ha senso.

In [77]: 

if any(df['x'] < df['y']): 
    print('True') 
else: 
    print('False') 
False 

In breve: cosa fa any() e all() effettivamente?

+0

ottengo vero in entrambi i casi. Sei sicuro che questo sia l'esempio che stai testando? – Marcin

+1

Dai un'occhiata a 'df ['x']

+1

Non riesco a riprodurre il bug che osservi. Per me, 'if any (df ['x']

risposta

6

Pandas suggerisce di utilizzare i metodi Serie any() e all(), non le funzioni di Python in-build.

Non capisco la fonte dello strano output che hai (ottengo True in entrambi i casi in Python 2.7 e Pandas 0.17.0). Ma prova quanto segue, dovrebbe funzionare. Questo utilizza i metodi Series.any() e Series.all().

import pandas as pd 

df = pd.DataFrame() 

df['x'] = [1,2,3] 
df['y'] = [3,4,5] 

print (df['x'] < df['y']).all() # more pythonic way of 
print (df['x'] < df['y']).any() # doing the same thing 

Questo dovrebbe stampare:

True 
True