0

0

Pandas DataFrame列加权求和:使用字典映射实现高效score计算

聖光之護

聖光之護

发布时间:2026-02-07 21:35:51

|

554人浏览过

|

来源于php中文网

原创

Pandas DataFrame列加权求和:使用字典映射实现高效score计算

本文介绍如何利用pandas的`.dot()`方法,结合权重字典对指定列进行加权乘积后求和,快速生成新列(如score),避免手动编写冗长表达式,兼顾可读性与扩展性。

在数据分析中,常需基于多列数值按不同权重计算综合得分(例如篮球球员的效率分:pts × 1 + ast × 1.5 + reb × 1.2 + tov × (−1))。若硬编码运算逻辑(如 df['pts'] + df['ast']*1.5 + ...),不仅易出错、难维护,且新增/调整权重时需反复修改代码。更优雅的方式是将权重抽象为字典,并通过向量化操作自动完成列筛选、加权与求和。

Pandas 提供了 .dot() 方法,专为矩阵/向量点积设计,天然适配此类场景:它会自动对齐 DataFrame 的列名与 Series 的索引,仅对共有的键名执行逐列乘法并横向求和,其余列(如本例中的 'oth' 和 'id')被自动忽略——这恰好满足“非所有列都参与计算”的需求。

以下是完整实现步骤:

  1. 准备数据与权重字典

    import pandas as pd
    
    df = pd.DataFrame({
        'id': [1, 2, 3],
        'pts': [25, 20, 9],
        'ast': [8, 14, 7],
        'reb': [1, 4, 9],
        'oth': [5, 6, 7],  # 不参与计算
        'tov': [4, 2, 1]
    })
    
    # 权重字典:键为列名,值为对应系数
    score_dict = {'pts': 1.0, 'reb': 1.2, 'ast': 1.5, 'tov': -1.0}
  2. 构造权重 Series 并执行点积
    注意:.dot() 要求 DataFrame 列名与 Series 索引严格对齐。因此需确保:

    • 权重字典的键必须是 DataFrame 中真实存在的列名;
    • 若需排除某些列(如 'id'),建议先 set_index() 或直接传入子集 DataFrame。

    ✅ 推荐做法(保留原始索引,安全通用):

    DALL·E 2
    DALL·E 2

    OpenAI基于GPT-3模型开发的AI绘图生成工具,可以根据自然语言的描述创建逼真的图像和艺术。

    下载
    # 将字典转为 Series,索引即列名
    weights = pd.Series(score_dict)
    
    # 对目标列子集执行点积(自动对齐,忽略不存在的键)
    df['score'] = df[weights.index].dot(weights)
    
    print(df)

    输出:

       id  pts  ast  reb  oth  tov  score
    0   1   25    8    1    5    4   34.2
    1   2   20   14    4    6    2   43.8
    2   3    9    7    9    7    1   29.3

    ⚠️ 注意事项:

    • 若 weights.index 中存在 DataFrame 里没有的列名,.dot() 会抛出 KeyError。可通过 weights = weights[weights.index.isin(df.columns)] 预过滤;
    • 不要对含非数值列(如字符串 'id')的整个 DataFrame 直接调用 .dot(),应显式选取数值列子集(如 df.select_dtypes('number'));
    • .dot() 返回的是 pd.Series,可直接赋值给新列,无需 .sum(axis=1)。
  3. 进阶:动态权重与复用性
    将该逻辑封装为函数,便于在不同数据集或权重策略间切换:

    def add_weighted_score(df: pd.DataFrame, weights: dict, new_col: str = 'score') -> pd.DataFrame:
        """为DataFrame添加加权得分列"""
        w_series = pd.Series(weights)
        valid_cols = w_series.index.intersection(df.columns)
        if len(valid_cols) == 0:
            raise ValueError("No matching columns found between weights and DataFrame")
        df[new_col] = df[valid_cols].dot(w_series[valid_cols])
        return df
    
    # 使用示例
    df = add_weighted_score(df, score_dict, 'player_score')

总结:相比手动链式计算,df[cols].dot(pd.Series(weights)) 是更健壮、可维护、符合 Pandas 向量化哲学的解决方案。它天然支持权重字典驱动、自动列对齐、缺失列容错,是构建评分系统、特征工程或业务指标的理想工具

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

73

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

3

2026.01.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

424

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1515

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

634

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

779

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

752

2024.04.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Rust 教程
Rust 教程

共28课时 | 5.5万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号