Python函数中如何获取逻辑变量名而非值更新DataFrame列
解决方法
核心思路是显式传入逻辑名称,避免依赖复杂且不可靠的变量名自动获取逻辑,推荐以下两种简洁实用的方案:
方案1:使用配置列表传递逻辑与对应参数
直接定义包含逻辑名称、判断条件、Value列取值的配置列表,函数遍历列表完成批量更新:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'col1': [10, 20, 30, 40], 'col2': [5, 15, 25, 35], 'Change': ['']*4, 'Value': [0]*4 }) # 定义判断逻辑 logic1 = df['col1'] > 20 logic2 = df['col2'] < 10 def update_change_value(df, logic_configs): for config in logic_configs: mask = config['condition'] df.loc[mask, 'Change'] = config['name'] df.loc[mask, 'Value'] = config['value'] # 调用函数:传入包含所有逻辑配置的列表 logic_configs = [ {'name': 'logic1', 'condition': logic1, 'value': df['col1'] * 0.5}, {'name': 'logic2', 'condition': logic2, 'value': df['col2'] + 10} ] update_change_value(df, logic_configs) print(df)
方案2:使用字典映射逻辑名称与参数
用字典的键存储逻辑名称,值存储(判断条件, Value取值)的元组,函数遍历字典完成更新:
def update_change_value(df, logic_map): for logic_name, (condition, value) in logic_map.items(): mask = condition df.loc[mask, 'Change'] = logic_name df.loc[mask, 'Value'] = value # 调用函数:传入逻辑映射字典 logic_map = { 'logic1': (logic1, df['col1'] * 0.5), 'logic2': (logic2, df['col2'] + 10) } update_change_value(df, logic_map)
备选:自动获取变量名(不推荐)
如果一定要自动获取变量名,可以用inspect模块实现,但这种方法存在局限性(无法识别表达式、多变量指向同一对象时会出错),仅作参考:
import inspect def get_logic_name(condition): caller_vars = inspect.currentframe().f_back.f_locals.items() for name, val in caller_vars: if val is condition: return name return None def update_change_value(df, *conditions): for cond in conditions: logic_name = get_logic_name(cond) if logic_name: df.loc[cond, 'Change'] = logic_name # 自行定义Value列的取值逻辑,比如对应某列的值 df.loc[cond, 'Value'] = df.loc[cond, 'col1'] # 调用函数:直接传入逻辑变量 update_change_value(df, logic1, logic2)
内容的提问来源于stack exchange,提问作者JJM
相关产品推荐
相关产品推荐

