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

如何用Lambda+Apply迭代从字典获取DataFrame分数?报错解决

问题解决:Pandas迭代计算分数字段报错及正确实现

错误原因解析

原代码出现AttributeError: 'function' object has no attribute 'apply'的核心问题:

  • 映射数据d是列表格式,却被错误当作字典使用,且lambda x:x[d]的写法完全不符合语法逻辑;
  • touch3["var"]被赋值为单个字符串(而非Pandas Series),单个字符串对象不存在apply方法;
  • 直接通过索引修改Score列元素(touch3["Score"][i])会引发性能问题和潜在的SettingWithCopy警告;
  • 使用shift(1)获取的Score_Shift是初始数据的静态前一行值,无法同步后续计算出的最新分数,导致逻辑错误。

正确实现代码

import pandas as pd

# 初始数据
data = [[1, "Won", 1, "Five", "Zero"],
        [2, "Lost", 1, "", ""],
        [3, "Lost", 1, "", ""],
        [4, "Lost", 0, "Five", "Zero"],
        [5, "Lost", 0, "", ""],
        [6, "Won", 0, "", ""]]

touch3 = pd.DataFrame(data, columns=["Seconds", "WonLost", "OnServeCorrected", "S_Score", "R_Score"])

# 初始化Score列:非空的S_Score和R_Score拼接,空值留空
touch3["Score"] = touch3.apply(lambda row: f"{row['S_Score']}_{row['R_Score']}" if row['S_Score'] and row['R_Score'] else "", axis=1)

# 将映射规则转为字典,用键值对快速查找目标分数
score_map = {
    'Won_0_Five_Zero': "Five_Five",
    'Won_1_Five_Zero': "Three_Zero",
    'Lost_0_Five_Zero': "Three_Zero",
    'Lost_1_Five_Zero': "Five_Five",
    'Won_0_Five_Five': "Five_Three",
    'Lost_0_Five_Five': "Three_Five",
    'Won_1_Five_Five': "Three_Five",
    'Lost_1_Five_Five': "Five_Three"
}

# 逐行迭代计算:从第二行开始,依赖前一行的最新Score结果
for i in range(1, len(touch3)):
    if not touch3.loc[i, "Score"]:
        # 生成查询键:WonLost_OnServeCorrected_前一行Score
        key = f"{touch3.loc[i, 'WonLost']}_{touch3.loc[i, 'OnServeCorrected']}_{touch3.loc[i-1, 'Score']}"
        # 从映射字典获取分数并赋值
        touch3.loc[i, "Score"] = score_map.get(key, "")
        # 拆分Score回S_Score和R_Score(按需保留)
        if touch3.loc[i, "Score"]:
            s, r = touch3.loc[i, "Score"].split("_")
            touch3.loc[i, "S_Score"] = s
            touch3.loc[i, "R_Score"] = r

print(touch3)

代码说明

  • 映射字典化:把原列表转为字典score_map,通过键值对快速匹配目标分数,彻底替代大量if判断;
  • 动态迭代计算:从第二行开始,每一行的分数依赖前一行计算完成的Score值,保证逻辑连贯性;
  • 安全赋值:使用loc方法修改DataFrame元素,避免SettingWithCopy警告;
  • 字段还原:可选将计算出的Score拆回S_Score和R_Score,还原原始数据结构。

最终输出结果

SecondsWonLostOnServeCorrectedS_ScoreR_ScoreScore
1Won1FiveZeroFive_Zero
2Lost1FiveFiveFive_Five
3Lost1FiveThreeFive_Three
4Lost0FiveZeroFive_Zero
5Lost0ThreeZeroThree_Zero
6Won0ThreeFiveThree_Five

内容的提问来源于stack exchange,提问作者James Oliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:47:22