使用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
相关产品推荐
相关产品推荐

