Найти - Пользователи
Полная версия: Как создать совокупное условие для dataframe?
Начало » Python для новичков » Как создать совокупное условие для dataframe?
1 2
antosha
Пользователь на форме заполнил отборы, которые хочет применить, и я в коде выполняю их:
 for selection in self.selections:
            column_name = selection.column.get_name()
            value = selection.value
            
            compare_operation = selection.compare_operation
            if  compare_operation == '=':   
                data = data[data[column_name] == value]
            elif compare_operation == '!=':   
                data = data[data[column_name] != value]
            elif compare_operation == '<':   
                data = data[data[column_name] < value]
            elif compare_operation == '<=':   
                data = data[data[column_name] <= value]
            elif compare_operation == '>':   
                data = data[data[column_name] > value]
            elif compare_operation == '>':   
                data = data[data[column_name] >= value]

Как в коде делать отборы не по одному, а все разом? Что- то типа:
 data = data[data[col1] > value1 and data[col2] < value2 and data[col3] != value3]
doza_and
Насчет dataframe не знаю, но в numpy вот так
 #
import numpy asn np
a=np.arnage(20)
ind= (a<5) & (a<10) | (a>15) & (a>10)
a[ind]
Вместо &| можно использовать *+
antosha
doza_and
Насчет dataframe не знаю, но в numpy вот так

Так смысл- то в оптимизации: если первое условие невыполнено (False), то для этой строки не будут вычисляться остальные условия. А в вашем случае сначала вычисляться все условия, а потом логически сложатся: сначала вычислится булев массив
 data[col1] > value1
, потом
 data[col2] < value2
… и когда все они будут найдены, то рассчитается итоговый булев массив.
Последовательно у меня уже приведен пример в топике. Вопрос как сделать оптимально.
xam1816
Может подойдёт функция all()
antosha
xam1816
Может подойдёт функция all()

Интересно как она поможет?
antosha
Думаю, можно обычной конкатенацией строк соединить в одно условие, а потом использовать eval().
doza_and
antosha
Так смысл- то в оптимизации:
Где вы в посте написали что смысл в оптимизации???

А так я вас не понял. Вы написали что
antosha
Как в коде делать отборы не по одному, а все разом?
я и не обратил внимание что выполняете только одну операцию.
Поясните тогда как по вашему должен работать ваш псевдокод.
 data = data[data[col1] > value1 and data[col2] < value2 and data[col3] != value3]

Те почему это будет работать быстрее чем исходный вариант?
py.user.next
antosha
Как в коде делать отборы не по одному, а все разом? Что- то типа:
 data = data[data[col1] > value1 and data[col2] < value2 and data[col3] != value3]
  
data = data[all((data[col1] > value1, data[col2] < value2, data[col3] != value3))]

  
>>> x = ['F', 'OK'][all((1 > 3, 3 > 2))]
>>> x
'F'
>>> x = ['F', 'OK'][all((1 < 3, 3 > 2))]
>>> x
'OK'
>>>

https://docs.python.org/3/library/functions.html#all
Equivalent to:
  
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
antosha
Какое- то сборище балбесов.
xam1816
antosha
Какое- то сборище балбесов.
Покажи свой вариант решения или полный код,хочется посмотреть к чему надо стремиться…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB