Pandas groupby多级分组如何提取任意层级分组名称值
解决方案
问题背景
现有15行数据的Pandas DataFrame对象df,包含['group_A', 'group_B', 'group_C']三个分组列,每个分组列包含2种取值(例如group_A的取值为a1、a2),三级分组计数结构如下:
>>> display(df.groupby(['group_A','group_B','group_C']).size()) group_A group_B group_C a1 b1 c1 1 b2 c1 2 c2 2 a2 b1 c1 1 b2 c1 1 c2 8 Name: size, dtype: int64
目前通过.size()方法可提取到计数序列[1,2,2,1,1,8],需要按相同分组排序提取最内层group_C的对应取值序列[c1,c1,c2,c1,c1,c2]。
注:示例中调用
groupby时仅传入了前两个分组字段,无法获取第三层group_C的分组信息,需要将三个分组字段全部传入groupby参数。
具体实现
- 方法1:操作多级索引直接提取层级值
分组结果默认生成三级多级索引,直接调用索引接口提取对应层级的取值即可,取值顺序和计数序列完全对齐:
# 完成三级分组统计 group_stat = df.groupby(['group_A', 'group_B', 'group_C']).size() # 提取计数序列 row_count_list = group_stat.tolist() # 提取group_C层级的取值,既可以传层级名,也可以传层级序号(从0开始,第三层序号为2) group_c_list = group_stat.index.get_level_values('group_C').tolist()
运行后group_c_list输出即为['c1', 'c1', 'c2', 'c1', 'c1', 'c2']。
- 方法2:关闭分组索引转普通表取列
分组时传入as_index=False可以让分组结果返回普通结构化DataFrame,直接取对应列即可:
group_stat_df = df.groupby(['group_A', 'group_B', 'group_C'], as_index=False).size() row_count_list = group_stat_df['size'].tolist() group_c_list = group_stat_df['group_C'].tolist()
内容的提问来源于stack exchange,提问作者rnoodle
相关产品推荐
相关产品推荐

