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

Python中向多层索引DataFrame添加值的报错问题

问题分析与解决

错误原因

你的代码报错核心是**df.at的用法完全错误**:

  • df.at的正确语法是df.at[行索引, 列名] = 要设置的值,你却把索引、列、值全塞到了括号里,导致参数传递混乱,触发takeable相关的类型错误。
  • 用df.loc[row["team"], row["gender"]]获取索引完全多余,多层索引的行索引直接用元组(row["team"], row["gender"])即可。

修正方案

方法1:修正遍历代码

for index, row in df2.iterrows():
    # 构造多层索引的行索引元组
    idx = (row["team"], row["gender"])
    if row["winner"] == row["team"]:
        df.at[idx, "wins"] += 1
    else:
        df.at[idx, "loss"] += 1

方法2:高效向量化操作(推荐)

遍历iterrows()效率极低,数据量大时优先用分组统计的方式:

  1. 给比赛记录标记胜负状态:
df2["is_win"] = df2["winner"] == df2["team"]
  1. 按队伍和性别分组统计胜负次数:
stats = df2.groupby(["team", "gender"])["is_win"].agg(
    wins=lambda x: x.sum(),
    loss=lambda x: len(x) - x.sum()
)
  1. 将统计结果更新到原DataFrame:
df.update(stats)

关键注意事项

  • 确保df的多层索引顺序是(team, gender),和分组的字段顺序一致,否则会出现匹配失败。
  • 向量化操作的效率比遍历高几个数量级,数据量大时必须优先选择这种方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:03:29