У меня есть фрейм данных. Мне нужно создать новый столбец, если соблюдены определенные условия. Я создал логику в переменной.
Пример:
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)
Я искал некоторое время и, похоже, не нашел ничего, что могло бы помочь.
Есть предположения?
Можете ли вы привести мне пример того, что вы имеете в виду?
Верно. В ЛЮБОЙ РАЗ, когда вы придумываете имена типа xxx1, xxx2 и т. д., вам следует заменить их списком или словарем.
переменные не должны содержать в своих именах данные программы. Имя переменной предназначено для человека, читающего код. Вместо этого используйте соответствующий тип данных, чтобы связать строку с другим объектом. Итак, список объектов tuple может работать, например. logics = [('logic1', 'unit_sales > 1000 and total_sales >= 1000000'), ...] или, возможно, dict: logics = {'logic1': 'unit_sales > 1000 and total_sales >= 1000000', ...}






Параметры передаются по значению. Невозможно получить имя, использованное в аргументе (это может быть не именованная переменная, а любое выражение).
Используйте словарь, который сопоставляет логические имена с выражениями. Затем передайте ключ функции и используйте его для поиска логики по имени и сохраните это имя в фрейме данных.
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' Есть идеи?
Я не уверен, почему. Пропадет ли предупреждение, если разделить его на два присваивания, как в исходном коде?
Вам следует использовать dict, чтобы можно было передать
d['logic1']в свою функцию.