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

Pandas:分组后DataFrame前两列访问异常问题求助

问题描述

我执行了以下代码,对DataFrame按球队和位置分组计算助攻均值,并重命名了列:

# group by team and position and find mean assists
new = df.groupby(['team', 'position']).agg({'assists': ['mean']}).reset_index()

# rename columns 
new.columns = ['team', 'pos', 'mean_assists']

# view DataFrame
print(new)

输出的DataFrame如下:

team    pos mean_assists
0   A       G   5.0
1   B       F   6.0
2   B       G   7.5
3   M       C   7.5
4   M       F   7.0

但尝试用以下代码访问team列的元素时无法正常工作:

for i in range(5):
   print(new["team"][i])

原因分析

问题出在groupby.agg的列结构上:当使用agg({'assists': ['mean']})这种写法时,会生成多层列索引(MultiIndex)。即便你调用了reset_index()和重命名列,若没有彻底扁平化索引,new["team"]的结构可能不符合预期,导致无法通过[i]直接访问元素。

你可以先执行print(new.columns)查看列结构,如果输出是类似MultiIndex([('team', ''), ('pos', ''), ('mean_assists', 'mean')])的结果,就说明列索引仍处于多层状态。


解决方案

方案1:聚合时直接避免多层索引

修改聚合代码,直接指定列名,从根源上避免生成MultiIndex:

# 分组时设置as_index=False,同时直接指定聚合后的列名
new = df.groupby(['team', 'position'], as_index=False).agg(mean_assists=('assists', 'mean'))
# 重命名position列为pos
new.rename(columns={'position': 'pos'}, inplace=True)

此时生成的new列是单层索引,new["team"][i]或new.loc[i, "team"]都能正常访问。

方案2:修复原代码的列重命名逻辑

如果要保留原聚合方式,需确保彻底扁平化列索引:

new = df.groupby(['team', 'position']).agg({'assists': ['mean']}).reset_index()
# 强制扁平化列索引,覆盖原多层结构
new.columns = ['team', 'pos', 'mean_assists']
# 使用loc或iloc安全访问元素
for i in range(5):
    print(new.loc[i, 'team'])
    # 或按列位置访问:print(new.iloc[i, 0])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:41:12