Python遍历DataFrame调整宝可梦对草系攻击值的问题及优化
问题分析与解决方案
你的代码存在的核心问题
- 条件判断逻辑错误:你把类型值(比如
Grass)和["Type 1 == Fire"]这类格式混乱的列表做对比,完全不符合逻辑,应该直接和纯类型名称(如"Fire")比较,同时代码里还存在Type1== Steel这类拼写/格式错误。 - 赋值错误:循环中你每次添加的是整个
df_["Attack"]列,而非当前行的攻击值,最终grass_attack会是包含多个Series的列表,无法直接赋值给新列。 - 变量名不一致:代码里出现了未定义的
result.append,应该是grass_attack.append。
高效实现方法(无需手动遍历)
Pandas的优势在于矢量化操作,比手动遍历高效得多,推荐以下两种方式:
方法1:使用np.select(清晰直观)
先定义克制、被克制的类型集合,再批量计算调整值:
import numpy as np # 草系克制的类型(攻击减半) grass_resist = {"Fire", "Flying", "Poison", "Bug", "Steel", "Grass", "Dragon"} # 草系弱势的类型(攻击翻倍) grass_weak = {"Ground", "Water", "Rock"} # 构建条件与对应值的列表 conditions = [ df_["Type 1"].isin(grass_resist), df_["Type 1"].isin(grass_weak) ] values = [ df_["Attack"] / 2, df_["Attack"] * 2 ] # 计算调整后攻击值,默认保持原攻击 df_["grass_attack"] = np.select(conditions, values, default=df_["Attack"]) print(df_)
方法2:使用map结合字典映射
先构建类型到倍率的字典,再映射计算:
# 类型对应的攻击倍率字典 type_multiplier = { "Fire": 0.5, "Flying": 0.5, "Poison": 0.5, "Bug": 0.5, "Steel": 0.5, "Grass": 0.5, "Dragon": 0.5, "Ground": 2, "Water": 2, "Rock": 2 } # 计算调整后攻击,未匹配到的类型默认倍率为1 df_["grass_attack"] = df_["Attack"] * df_["Type 1"].map(type_multiplier).fillna(1) print(df_)
手动遍历的正确写法(不推荐,仅作参考)
如果一定要用遍历,需逐行获取对应值:
grass_attack = [] for idx, row in df_.iterrows(): type_1 = row["Type 1"] attack = row["Attack"] if type_1 in {"Fire", "Flying", "Poison", "Bug", "Steel", "Grass", "Dragon"}: grass_attack.append(attack / 2) elif type_1 in {"Ground", "Water", "Rock"}: grass_attack.append(attack * 2) else: grass_attack.append(attack) df_["grass_attack"] = grass_attack print(df_)
内容的提问来源于stack exchange,提问作者Dome
相关产品推荐
相关产品推荐

