Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 3, 2021 04:39:15

antosha
Зарегистрирован: 2021-02-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

Пользователь на форме заполнил отборы, которые хочет применить, и я в коде выполняю их:

 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]

Отредактировано antosha (Фев. 3, 2021 04:39:33)

Офлайн

#2 Фев. 3, 2021 07:10:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

Насчет dataframe не знаю, но в numpy вот так

 #
import numpy asn np
a=np.arnage(20)
ind= (a<5) & (a<10) | (a>15) & (a>10)
a[ind]
Вместо &| можно использовать *+



Офлайн

#3 Фев. 3, 2021 12:03:12

antosha
Зарегистрирован: 2021-02-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

doza_and
Насчет dataframe не знаю, но в numpy вот так

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

Отредактировано antosha (Фев. 3, 2021 13:16:42)

Офлайн

#4 Фев. 3, 2021 15:01:20

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

Может подойдёт функция all()

Офлайн

#5 Фев. 3, 2021 15:45:34

antosha
Зарегистрирован: 2021-02-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

xam1816
Может подойдёт функция all()

Интересно как она поможет?

Офлайн

#6 Фев. 3, 2021 18:21:45

antosha
Зарегистрирован: 2021-02-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

Думаю, можно обычной конкатенацией строк соединить в одно условие, а потом использовать eval().

Офлайн

#7 Фев. 3, 2021 21:44:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

antosha
Так смысл- то в оптимизации:
Где вы в посте написали что смысл в оптимизации???

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

Те почему это будет работать быстрее чем исходный вариант?



Офлайн

#8 Фев. 3, 2021 21:51:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9880
Репутация: +  853  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

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



Офлайн

#9 Фев. 5, 2021 11:55:03

antosha
Зарегистрирован: 2021-02-03
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

Какое- то сборище балбесов.

Офлайн

#10 Фев. 5, 2021 14:15:27

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Как создать совокупное условие для dataframe?

antosha
Какое- то сборище балбесов.
Покажи свой вариант решения или полный код,хочется посмотреть к чему надо стремиться…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version