如何按列索引而非列名使用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
相关产品推荐
相关产品推荐

