如何用Pandas遍历列中每行并新增对应EC2实例标签列?
解决Pandas遍历EC2实例ID添加标签列时整列值重复的问题
你的问题出在循环赋值逻辑上:每次执行df['Name'] = name时,是把整个列的所有行都设置为当前的name值,循环结束后所有行自然会被最后一次循环的结果覆盖。
下面是几种正确的实现方式:
方法1:使用Pandas的apply方法(最简洁)
直接对instanceID列应用标签获取函数,自动映射到每一行:
import boto3 import pandas as pd ec2 = boto3.resource('ec2') def get_instance_tags(instance): tags = {} instance_obj = ec2.Instance(instance) for tag in instance_obj.tags: if tag['Key'] == 'Name': tags['Instance Name'] = tag['Value'] if tag['Key'] == 'Description': tags['Description'] = tag['Value'] return tags # 读取CSV文件 df = pd.read_csv('your_ec2_instances.csv') # 生成Name列:对每个instanceID调用函数并提取Name标签 df['Name'] = df['instanceID'].apply(lambda x: get_instance_tags(x).get('Instance Name'))
方法2:循环时定位单行赋值
如果坚持用循环,需要通过索引定位到具体行,避免覆盖整列:
import boto3 import pandas as pd ec2 = boto3.resource('ec2') def get_instance_tags(instance): tags = {} instance_obj = ec2.Instance(instance) for tag in instance_obj.tags: if tag['Key'] == 'Name': tags['Instance Name'] = tag['Value'] if tag['Key'] == 'Description': tags['Description'] = tag['Value'] return tags df = pd.read_csv('your_ec2_instances.csv') # 先初始化Name列 df['Name'] = None # 遍历每个实例ID,通过索引赋值对应行 for idx, instance_id in df['instanceID'].items(): tags = get_instance_tags(instance_id) df.loc[idx, 'Name'] = tags.get('Instance Name')
方法3:批量获取标签(高效推荐)
如果实例数量较多,逐个调用API会比较慢,建议批量获取实例标签,减少API请求次数:
import boto3 import pandas as pd ec2 = boto3.resource('ec2') def get_batch_instance_tags(instance_ids): # 批量筛选实例 instances = ec2.instances.filter(InstanceIds=instance_ids) tag_map = {} for instance in instances: instance_tags = {} for tag in instance.tags: if tag['Key'] == 'Name': instance_tags['Instance Name'] = tag['Value'] if tag['Key'] == 'Description': instance_tags['Description'] = tag['Value'] tag_map[instance.id] = instance_tags return tag_map df = pd.read_csv('your_ec2_instances.csv') # 批量获取所有实例的标签 tag_map = get_batch_instance_tags(df['instanceID'].tolist()) # 映射到DataFrame的列 df['Name'] = df['instanceID'].map(lambda x: tag_map[x].get('Instance Name')) # 如果需要Description列也可以直接添加 df['Description'] = df['instanceID'].map(lambda x: tag_map[x].get('Description'))
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

