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

使用groupby+apply(list)时如何获取Pandas分组键(Group Key)

Pandas分组后获取分组键的解决方案

问题原因

执行df.groupby('account')['instance-id'].apply(list)后得到的是Series对象,而非GroupBy对象。groups是GroupBy对象的专属属性,因此直接调用df_group.groups.keys()会触发AttributeError。

这个Series的索引就是分组键(account编号),对应的值是该分组下的instance-id列表,直接利用这一点即可获取分组键。


解决方案一:直接遍历Series的索引与值

利用Series的items()方法(Pandas 1.5+推荐,旧版本可用iteritems()),同时获取分组键和对应的实例列表:

import os
import pandas as pd
import boto3
from prettytable import PrettyTable

df = pd.read_csv(os.path.join(__location__, 'instances.csv'))
# 生成以account为索引、instance列表为值的Series
df_group = df.groupby('account')['instance-id'].apply(list)

# 遍历分组键和实例列表
for account_id, instance_list in df_group.items():
    t = PrettyTable(['Instance ID', 'Instance Name', 'AMI-ID', 'AMI Name'])
    
    # AWS STS角色切换逻辑
    sts = boto3.client('sts')
    assume_role = sts.get_caller_identity().get('Arn').split('/')[1]
    assumed_role = sts.assume_role(
        RoleArn=f"arn:aws:iam::{account_id}:role/{assume_role}",
        RoleSessionName='Temporary_Session'
    )
    
    # 后续处理实例列表的逻辑...

解决方案二:保留GroupBy对象遍历

如果需要保留分组后的原始数据框,可以先创建GroupBy对象,再遍历每个分组的键和对应数据:

import os
import pandas as pd
import boto3
from prettytable import PrettyTable

df = pd.read_csv(os.path.join(__location__, 'instances.csv'))
# 创建未聚合的GroupBy对象
grouped = df.groupby('account')

# 遍历每个分组:account_id是分组键,group是对应的数据框
for account_id, group in grouped:
    t = PrettyTable(['Instance ID', 'Instance Name', 'AMI-ID', 'AMI Name'])
    
    # 提取当前分组的instance-id列表
    instance_list = group['instance-id'].tolist()
    
    # AWS STS角色切换逻辑
    sts = boto3.client('sts')
    assume_role = sts.get_caller_identity().get('Arn').split('/')[1]
    assumed_role = sts.assume_role(
        RoleArn=f"arn:aws:iam::{account_id}:role/{assume_role}",
        RoleSessionName='Temporary_Session'
    )
    
    # 后续处理实例列表的逻辑...

可复现测试代码

用你提供的测试数据验证上述方案:

import pandas as pd

data = {
    'account': [
        '111111111111111', '111111111111111', '111111111111111', '111111111111111',
        '111111111111111', '111111111111111', '222222222222222', '222222222222222',
        '222222222222222', '222222222222222', '222222222222222', '222222222222222'
    ],
    'instance-id': [
        'i-124f1c3c401ijk3c4', 'i-124f1c3c401ijk3c4', 'i-124f1c3c401ijk3c4', 'i-124f1c3c401ijk3c7',
        'i-124f1c3c401ijk3c8', 'i-124f1c3c401ijk3c9', 'i-124f1c3c401ijk3c176', 'i-124f1c3c401ijk3c177',
        'i-124f1c3c401ijk3c178', 'i-124f1c3c401ijk3c179', 'i-124f1c3c401ijk3c180', 'i-124f1c3c401ijk3c182'
    ]
}

df = pd.DataFrame(data)

# 测试方案一
df_group = df.groupby('account')['instance-id'].apply(list)
for acc, instances in df_group.items():
    print(f"账号 {acc} 的实例列表: {instances}")

# 测试方案二
grouped = df.groupby('account')
for acc, group in grouped:
    instances = group['instance-id'].tolist()
    print(f"账号 {acc} 的实例列表: {instances}")

内容的提问来源于stack exchange,提问作者Eduardo Santiago López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:51:11