Логические операции в PANDAS
проблема у меня возникла с пониманием булевых операций в python-Pandas и использованием ИЛИ.
Почему когда меняю условия местами меняется результат хотя стоит логический оператор ИЛИ.
import pandas as pd
df = pd.DataFrame({'ID':['1', '2', '3'], 'col_1': [7, 2, 7], 'col_2':[1, 4, 5],'col_3':[8,4,6]})
mylist = ['a', 'b', 'c', 'd', 'e', 'f']
col1=df['col_1']
col2=df['col_2']
col3=df['col_3']
sravn=(col1>col2).item #1 сравнение
print ('t1',sravn) #1
sravn=(col1>col3).item #2 сравнение
print ('t2',sravn) #2
- возвращает 1.
truefalsetrue - возвращает 2.
falsefalsetrue - ожидаемый результат при использовании ИЛИ:
truefalsetrue
print ('****-'*10)
sravn=(col1>col2).item or (col1>col3).item
print (sravn) #1 return true false true
sravn= (col1>col3).item or (col1>col2).item #2 return false false true
print (sravn) #2 return false false true
Как видно, результат во втором случае не соответствует первому. Почему при изменении очередности условий происходит такая замена, мне не понятно.
Ответы (1 шт):
Вы делаете что-то очень странное, item возвращает метод:
sravn=(col1>col2).item
print(type(sravn))
Вывод:
<class 'method'>
Что вы делаете с методом (а не с данными) я не очень понимаю, не удивительно, что в итоге что-то странное получается. Работать с Pandas.Series нужно так:
print ('t1', col1>col2, sep='\n') # на выходе Series
print ('t2', col1>col3, sep='\n') # на выходе Series
print ('****-'*10)
print((col1>col2) | (col1>col3)) # побитовое ИЛИ
print((col1>col3) | (col1>col2)) # побитовое ИЛИ
Вывод, результат от перестановки не меняется:
t1
0 True
1 False
2 True
dtype: bool
t2
0 False
1 False
2 True
dtype: bool
****-****-****-****-****-****-****-****-****-****-
0 True
1 False
2 True
dtype: bool
0 True
1 False
2 True
dtype: bool
Обратите внимание, что для векторов нужно использовать побитовое ИЛИ |, а не логическое ИЛИ or, которое применяется к объектам в целом, а не к частям объекта.