You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:45:49