如何用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,还原原始数据结构。
最终输出结果
| Seconds | WonLost | OnServeCorrected | S_Score | R_Score | Score |
|---|---|---|---|---|---|
| 1 | Won | 1 | Five | Zero | Five_Zero |
| 2 | Lost | 1 | Five | Five | Five_Five |
| 3 | Lost | 1 | Five | Three | Five_Three |
| 4 | Lost | 0 | Five | Zero | Five_Zero |
| 5 | Lost | 0 | Three | Zero | Three_Zero |
| 6 | Won | 0 | Three | Five | Three_Five |
内容的提问来源于stack exchange,提问作者James Oliver
相关产品推荐
相关产品推荐

