Pandas中如何访问分组列表里每个DataFrame的指定列?
解决GroupBy分组后提取指定列的问题
嘿,我明白你遇到的困扰了!你之前的写法行不通,核心是对GroupBy对象的迭代逻辑理解有点偏差,我来一步步帮你搞定:
问题根源
当你遍历grouped(GroupBy对象)时,循环变量i其实是每个分组的名称(也就是categories列的各个取值,比如"A"、"B"这类分类值),而不是索引。而且grouped[i]并不是用来获取对应分组DataFrame的正确方式——GroupBy对象的索引访问是用来选取列的,不是分组。
正确的解决方法
方法1:直接遍历GroupBy对象(推荐)
GroupBy对象迭代时,会返回(分组名称, 对应分组DataFrame)的元组,我们可以直接解构这个元组,轻松提取每个分组的vals列:
# 解构元组,直接获取分组的DataFrame并提取列 my_array = [group["vals"] for name, group in grouped]
这样得到的my_array就是由每个分组的vals列(Series类型)组成的列表。
方法2:先转成列表再处理
如果你已经把grouped转成了列表(比如group_list = list(grouped)),那列表里的每个元素都是(分组名称, 分组DataFrame)的元组,你可以这样操作:
group_list = list(grouped) # 方式a:通过索引取DataFrame部分 my_array = [group[1]["vals"] for group in group_list] # 方式b:解构元组(代码更清晰易读) my_array = [g["vals"] for _, g in group_list]
方法3:用get_group(适合单独获取特定分组)
如果你想通过分组名称来精准获取对应列,可以用get_group方法,不过遍历所有分组的话效率不如前两种:
# 先获取所有分组的名称 group_names = grouped.groups.keys() # 逐个获取分组并提取列 my_array = [grouped.get_group(name)["vals"] for name in group_names]
示例验证
我们用一个简单的测试数据来验证效果:
import pandas as pd # 构造测试DataFrame df = pd.DataFrame({ "categories": ["A", "A", "B", "B", "C"], "vals": [10, 20, 30, 40, 50] }) # 执行分组操作 grouped = df.groupby("categories") # 使用方法1提取列 my_array = [group["vals"] for name, group in grouped] # 打印结果查看 for idx, series in enumerate(my_array): print(f"分组{idx+1}的vals列:\n{series}\n")
输出结果会是:
分组1的vals列: 0 10 1 20 Name: vals, dtype: int64 分组2的vals列: 2 30 3 40 Name: vals, dtype: int64 分组3的vals列: 4 50 Name: vals, dtype: int64
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

