我有一个数据框。如果满足某些条件,我需要创建一个新列。我已经在变量中创建了逻辑。
示例:
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)
我搜索了一段时间,似乎找不到任何有帮助的东西。
有什么想法吗?
参数按值传递。无法获取参数中使用的名称(它可能不是命名变量,它可以是任何表达式)。
使用将逻辑名称映射到表达式的字典。然后将密钥传递给函数,并使用它按名称查找逻辑,并将该名称保存在数据框中。
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)