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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:05:18