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

如何按列索引而非列名使用Pandas的groupby方法?

问题

我有一段用来创建带重复项计数的groupby对象的代码:

gbo = data2.groupby("1").count()
display(gbo)

这段代码在列名为数字索引时能正常运行,但列名为非数字(比如Col1、Col2)时就失效了。我想通过列索引编号来调用列,实现groupby统计,需要简洁的正确语法。

举个例子,我现在有如下数据和代码:

import numpy as np
import pandas as pd
from IPython.display import display

mydat = [{"a":"gnome", "b": "home", "c": "trail", "d" : np.nan},
        {"a": "goblin", "b": "fort", "c": "tower", "d" : "open"}, 
        {"a": "tree", "b": "forest", "c": np.nan, "d" : np.nan},
        {"a": "tree", "b": "grove", "c": np.nan, "d" : np.nan},
        {"a": "gnome", "b": "hill", "c": "shade", "d" : "sleep"}]

mydf = pd.DataFrame(mydat)
# 数据结构如下:
#     a      b       c       d
# 0  gnome  home    trail    NaN
# 1  goblin fort    tower   open
# 2  tree   forest   NaN     NaN
# 3  tree   grove    NaN     NaN
# 4  gnome  hill    shade   sleep

www = mydf.groupby("a").count()
display(www)

运行后得到的结果:

b  c  d
a              
gnome   2  2  1
goblin  1  1  1
tree    2  0  0

现在我是通过列标签"a"实现的分组统计,想改成用**列索引(比如列a对应索引0)**来实现,能不能一行代码搞定?还是必须先重命名列?

解决方案

完全可以一行代码实现,不需要重命名列。有两种简洁的写法:

方法1:通过df.columns[index]获取列名传入groupby

直接用列索引定位到对应列名,再传给groupby,兼容所有列名场景:

www = mydf.groupby(mydf.columns[0]).count()
display(www)

这里mydf.columns[0]会返回列索引0对应的列名(也就是"a"),和直接写groupby("a")效果完全一致,不管列名是数字还是非数字都能正常运行。

方法2:用get_level_values(适配多层列索引场景)

如果你的DataFrame是多层列索引结构,可以用这个方法:

www = mydf.groupby(mydf.columns.get_level_values(0)).count()

不过对于单层列索引的情况,方法1更简洁直接。

注意:不要直接写groupby(0),这会被pandas当成是按值为0的行分组,而非按第0列分组——这也是你之前用groupby("1")能生效(列名是字符串"1"),但非数字列名时失效的核心原因,本质是混淆了列索引和列名的概念。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:02:38