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

如何在Pandas中从DataFrameGroupBy对象获取分组变量的列名?

如何从Pandas的DataFrameGroupBy对象直接获取分组列名?

你说得对,完全没必要通过size()这类聚合操作间接拿分组列名——DataFrameGroupBy对象本身就存储着这些元数据,直接读取就行。

最直接高效的方法是访问对象的grouper.names属性,它会直接返回你分组时用的列名列表,完全没有额外的计算开销:

import pandas as pd
import numpy as np

# 你的示例数据
df = pd.DataFrame(
    [
        ("bird", "Falconiformes", 389.0),
        ("bird", "Psittaciformes", 24.0),
        ("mammal", "Carnivora", 80.2),
        ("mammal", "Primates", np.nan),
        ("mammal", "Carnivora", 58),
    ],
    index=["falcon", "parrot", "lion", "monkey", "leopard"],
    columns=("class", "order", "max_speed"),
)
grouped = df.groupby(["class", "order"])

# 获取分组列名
group_col_names = grouped.grouper.names
print(group_col_names)  # 输出: ['class', 'order']

为什么这个方法管用?

grouper是DataFrameGroupBy对象内部的分组器组件,它负责记录你分组时指定的键(无论是列名、函数还是其他分组依据),而names属性就直接存储了这些分组键的名称(对应你传入的列名字符串)。

适配单分组列的情况

如果是单列分组,比如grouped_single = df.groupby("class"),这个方法同样适用,grouped_single.grouper.names会返回['class'],完全兼容。

结合你的实际需求使用

针对你想要把分组键和处理结果关联的场景,可以用这个列名列表来构建清晰的分组标识,比如:

# 遍历分组并生成目标格式的结果
result_list = []
for group_key, group_df in grouped:
    # 将分组列名和键值配对,生成类似"class=bird,order=Falconiformes"的字符串
    group_label = ", ".join([f"{col}={val}" for col, val in zip(group_col_names, group_key)])
    # 处理分组数据(这里以均值为例,你可以替换成自己的逻辑)
    processed_val = group_df["max_speed"].mean(skipna=True)
    result_list.append({"group": group_label, "max_speed": processed_val})

# 转成DataFrame查看结果
result_df = pd.DataFrame(result_list)
print(result_df)

输出结果就会和你预期的格式一致:

group  max_speed
0   class=bird,order=Falconiformes      389.0
1  class=bird,order=Psittaciformes       24.0
2      class=mammal,order=Carnivora       69.1
3       class=mammal,order=Primates        NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:37:43