2016-11-13 2 views
2
>>> df.head() 
         № Summer Gold Silver Bronze Total № Winter \ 
Afghanistan (AFG)    13  0  0  2  2   0 
Algeria (ALG)     12  5  2  8  15   3 
Argentina (ARG)    23 18  24  28  70  18 
Armenia (ARM)     5  1  2  9  12   6 
Australasia (ANZ) [ANZ]   2  3  4  5  12   0 

         Gold.1 Silver.1 Bronze.1 Total.1 № Games Gold.2 \ 
Afghanistan (AFG)    0   0   0  0  13  0 
Algeria (ALG)     0   0   0  0  15  5 
Argentina (ARG)    0   0   0  0  41  18 
Armenia (ARM)     0   0   0  0  11  1 
Australasia (ANZ) [ANZ]  0   0   0  0  2  3 

         Silver.2 Bronze.2 Combined total 
Afghanistan (AFG)    0   2    2 
Algeria (ALG)     2   8    15 
Argentina (ARG)    24  28    70 
Armenia (ARM)     2   9    12 
Australasia (ANZ) [ANZ]   4   5    12 

Не уверен, почему я вижу эту ошибку:ValueError: Значение истинности Серии неоднозначна

>>> df['Gold'] > 0 | df['Gold.1'] > 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/ankuragarwal/data_insight/env/lib/python2.7/site-packages/pandas/core/generic.py", line 917, in __nonzero__ 
    .format(self.__class__.__name__)) 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Что неоднозначное здесь?

Но это работает:

>>> (df['Gold'] > 0) | (df['Gold.1'] > 0) 
+0

@MaxU Если вы ответите на свой вопрос, я соглашусь с ним. – abc

ответ

3

Предположим, что мы имеем следующую DF:

In [35]: df 
Out[35]: 
    a b c 
0 9 0 1 
1 7 7 4 
2 1 8 9 
3 6 7 5 
4 1 4 6 

Следующая команда:

df.a > 5 | df.b > 5 

потому что | имеет более высокий приоритет (по сравнению с >) как указано в Operator precedence table) i т будет переведен на:

df.a > (5 | df.b) > 5 

который будет переведен на:

df.a > (5 | df.b) and (5 | df.b) > 5 

шаг за шагом:

In [36]: x = (5 | df.b) 

In [37]: x 
Out[37]: 
0  5 
1  7 
2 13 
3  7 
4  5 
Name: c, dtype: int32 

In [38]: df.a > x 
Out[38]: 
0  True 
1 False 
2 False 
3 False 
4 False 
dtype: bool 

In [39]: x > 5 
Out[39]: 
0 False 
1  True 
2  True 
3  True 
4 False 
Name: b, dtype: bool 

но последней операции won't work:

In [40]: (df.a > x) and (x > 5) 
--------------------------------------------------------------------------- 
... 
skipped 
... 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Сообщение об ошибке abo ве может привести неопытных пользователей, чтобы сделать что-то вроде этого:

In [12]: (df.a > 5).all() | (df.b > 5).all() 
Out[12]: False 

In [13]: df[(df.a > 5).all() | (df.b > 5).all()] 
... 
skipped 
... 
KeyError: False 

Но в этом случае вам просто необходимо установить приоритет явно для того, чтобы получить ожидаемый результат:

In [10]: (df.a > 5) | (df.b > 5) 
Out[10]: 
0  True 
1  True 
2  True 
3  True 
4 False 
dtype: bool 

In [11]: df[(df.a > 5) | (df.b > 5)] 
Out[11]: 
    a b c 
0 9 0 1 
1 7 7 4 
2 1 8 9 
3 6 7 5 
0

Это реальная причина ошибка:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html

панда следует Numpy условности возникновения ошибки при попытке преобразовать что-то логическое значение. Это происходит в случае, когда или когда используются логические операции, и, или, или нет. Неясно, что результат

>>> if pd.Series([False, True, False]): 
    ... 

должно быть. Должна ли она быть Истиной, потому что это не нуль? False, потому что есть значения False? Неясно, поэтому вместо панды поднимает ValueError:

>>> if pd.Series([False, True, False]): 
    print("I was true") 
Traceback 
    ... 
ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all(). 

Если вы видите, что вам нужно явно выбрать то, что вы хотите сделать с ним (например, использовать любые(), все() или пусто) , или, вы можете сравнить, если объект pandas равен None

+0

Эта выдержка не поможет вам с вашей логической проблемой индексирования. Можно подумать, что решением было бы изменить 'df ['Gold']> 0 | df ['Gold.1']> 0' to '(df ['Gold']> 0) .all() | (df ​​['Gold.1']> 0) .all() 'вместо того, чтобы устанавливать приоритет явно – MaxU