Логические операции в 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. true false true
  • возвращает 2. false false true
  • ожидаемый результат при использовании ИЛИ: true false true
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 шт):

Автор решения: CrazyElf

Вы делаете что-то очень странное, 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, которое применяется к объектам в целом, а не к частям объекта.

→ Ссылка