如何在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
相关产品推荐
相关产品推荐

