Имена переменных функций Python, а не значения

У меня есть фрейм данных. Мне нужно создать новый столбец, если соблюдены определенные условия. Я создал логику в переменной.

Пример:

logic1 = '''
unit_sales > 1000 and total_sales >= 1000000
'''

logic2 = '''
unit_sales < 100 and total_sales < 10
'''

Я создал два новых столбца:

df[['Change','Value']] = None

Затем, исходя из моей логики, значение устанавливается или игнорируется:

df.loc[df.eval(logic1),'Change'] = 'logic1'
df.loc[df.eval(AP2_on),'Value'] = 500

Это прекрасно работает. У меня есть новое значение, основанное на моей логике, и поле, которое сообщает мне, какая логика внесла изменения. Проблема в том, что я хочу превратить это в функцию, чтобы мне не приходилось повторять код. Что-то вроде этого:

    def function(logic, value):
        df.loc[df.eval(logic),'Change'] = logic 
#----I need the variable name (i.e. 'logic1' and not the variable value#
        df.loc[df.eval(logic),'Value'] = value
        return df

    df = function(logic1, 500)

Я искал некоторое время и, похоже, не нашел ничего, что могло бы помочь.

Есть предположения?

Вам следует использовать dict, чтобы можно было передать d['logic1'] в свою функцию.

chepner 10.04.2024 23:44

Можете ли вы привести мне пример того, что вы имеете в виду?

JJM 10.04.2024 23:55

Верно. В ЛЮБОЙ РАЗ, когда вы придумываете имена типа xxx1, xxx2 и т. д., вам следует заменить их списком или словарем.

Tim Roberts 11.04.2024 00:05

переменные не должны содержать в своих именах данные программы. Имя переменной предназначено для человека, читающего код. Вместо этого используйте соответствующий тип данных, чтобы связать строку с другим объектом. Итак, список объектов tuple может работать, например. logics = [('logic1', 'unit_sales > 1000 and total_sales >= 1000000'), ...] или, возможно, dict: logics = {'logic1': 'unit_sales > 1000 and total_sales >= 1000000', ...}

juanpa.arrivillaga 11.04.2024 00:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Параметры передаются по значению. Невозможно получить имя, использованное в аргументе (это может быть не именованная переменная, а любое выражение).

Используйте словарь, который сопоставляет логические имена с выражениями. Затем передайте ключ функции и используйте его для поиска логики по имени и сохраните это имя в фрейме данных.

logic_dict = {
    'logic1': '''unit_sales > 1000 and total_sales >= 1000000''',
    'logic2': '''unit_sales < 100 and total_sales < 10'''
}

def function(logic, value):
    df.loc[df.eval(logic_dict[logic]), ['Change', 'Value']] = [logic, value] 
    return df

df = function('logic1', 500)

Я получаю предупреждение: «VisibleDeprecationWarning: создание ndarray из неровных вложенных последовательностей (который представляет собой список или кортеж списков или кортежей или ndarrays различной длины или формы) устарело. Если вы хотели это сделать, вы должны указать «dtype=object» при создании ndarray. return asarray(a).ndim' Есть идеи?

JJM 11.04.2024 17:00

Я не уверен, почему. Пропадет ли предупреждение, если разделить его на два присваивания, как в исходном коде?

Barmar 11.04.2024 19:23

Другие вопросы по теме