如何用apply循环处理同类型列生成评分?Pandas技术问询
错误原因
你在循环里传递给df.apply()的是字符串(比如'b_score_function'),但apply方法需要接收的是实际的函数对象,而非函数名的字符串。Python无法将字符串解析为对应的函数,因此抛出了这个错误。
可复用实现方案
方案一:字典映射函数(适配现有独立函数)
先创建列名与对应评分函数的映射字典,循环时直接从字典中调用函数对象:
# 建立列名到评分函数的映射 score_func_map = { 'b': b_score_function, 'c': c_score_function } ds_cols = df.columns.difference(['a_id']).to_list() for col in ds_cols: df[f'{col}_score'] = df.apply(score_func_map[col], axis=1)
方案二:通用评分函数(推荐,减少重复代码)
将评分逻辑抽象为通用函数,通过参数传递列名和区间规则,无需为每个列单独写函数:
def calc_score(row, col_name, rule): """ 通用列评分函数 :param row: DataFrame行对象 :param col_name: 目标列名 :param rule: 评分规则列表,按区间从小到大排列,格式为[(上限, 分数), ...] """ val = row[col_name] for upper, score in rule: if val <= upper: return score return 1 # 定义各列的评分规则 col_rules = { 'b': [(0, 0), (2, 0.25)], 'c': [(0, 0), (1, 0.5)] } ds_cols = df.columns.difference(['a_id']).to_list() for col in ds_cols: df[f'{col}_score'] = df.apply(calc_score, axis=1, args=(col, col_rules[col]))
方案三:pd.cut向量化实现(高效处理大数据)
如果是数值型列的区间评分,用pandas的cut方法比逐行apply效率更高:
import pandas as pd # 定义各列的区间和对应分数 col_configs = { 'b': { 'bins': [-float('inf'), 0, 2, float('inf')], 'scores': [0, 0.25, 1] }, 'c': { 'bins': [-float('inf'), 0, 1, float('inf')], 'scores': [0, 0.5, 1] } } ds_cols = df.columns.difference(['a_id']).to_list() for col in ds_cols: config = col_configs[col] # 用cut划分区间并映射分数 df[f'{col}_score'] = pd.cut( df[col], bins=config['bins'], labels=config['scores'], include_lowest=True ).astype(float)
内容的提问来源于stack exchange,提问作者Deysiz
相关产品推荐
相关产品推荐

