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()效率极低,数据量大时优先用分组统计的方式:
- 给比赛记录标记胜负状态:
df2["is_win"] = df2["winner"] == df2["team"]
- 按队伍和性别分组统计胜负次数:
stats = df2.groupby(["team", "gender"])["is_win"].agg( wins=lambda x: x.sum(), loss=lambda x: len(x) - x.sum() )
- 将统计结果更新到原DataFrame:
df.update(stats)
关键注意事项
- 确保df的多层索引顺序是
(team, gender),和分组的字段顺序一致,否则会出现匹配失败。 - 向量化操作的效率比遍历高几个数量级,数据量大时必须优先选择这种方式。
内容的提问来源于stack exchange,提问作者rzan1
相关产品推荐
相关产品推荐

