如何用Pandas iloc提取DataFrame多列邮箱值并存储为列表
问题描述
现有如下结构的Pandas DataFrame:
import pandas as pd import numpy as np df1 = pd.DataFrame({'region': ['ASEAN','ANZ','INDIA','KOREA'], 'first_contact':['user1','user2','user3','user4'],'first_contact_email':['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com'], 'second_contact':['user11','user21','user31','user41'],'second_contact_email':['user11@gmail.com','user21@gmail.com','user31@gmail.com','user41@gmail.com'], 'third_contact':['user111','user211','user311','user411'],'third_contact_email':['user111@gmail.com','user211@gmail.com','user311@gmail.com','user411@gmail.com'], 'fourth_contact':['user1111','user2111','user3111','user4111'],'fourth_contact_email':['user1111@gmail.com','user2111@gmail.com','user3111@gmail.com','user4111@gmail.com'], 'fifth_contact':['user11111','user21111','user31111','user41111'],'fifth_contact_email':['user11111@gmail.com','user21111@gmail.com',np.nan,np.nan], 'sixth_contact':['user111111','user211111','user311111','user411111'],'sixth_contact_email':['user111111@gmail.com','user211111@gmail.com',np.nan,np.nan]})
需要实现:
- 按地区遍历每一行
- 提取该行所有邮箱ID
- 将邮箱存入列表用于发送邮件
原尝试代码存在提取错误,需要用iloc或列位置实现正确提取。
解决方案
方法1:用iloc按列位置提取(符合需求)
邮箱列的位置是从索引2开始、步长为2的列(每两列一组,第二列是邮箱)。直接通过iloc选中这些列,再处理每个地区的行:
import pandas as pd import numpy as np region_list = ['ASEAN','INDIA','KOREA','ANZ'] for region in region_list: # 修正原代码列名大小写错误:原DataFrame列名是小写'region' target_row = df1[df1['region'] == region].iloc[0] # 提取所有邮箱列(索引2开始,每2列取1列),过滤空值后转成列表 email_list = target_row.iloc[2::2].dropna().tolist() print(f"地区 {region} 的邮箱列表:{email_list}") # 此处添加发送邮件的代码
关键说明:
- 原代码列名拼写错误:是
df1['region']而非df1['Region'] iloc[2::2]:精准选中所有邮箱列,避免依赖列名拼写dropna():自动过滤掉INDIA、KOREA这类存在的空邮箱(NaN值)tolist():把Pandas Series直接转成普通列表,方便后续调用邮件接口
方法2:按列名筛选(更直观)
如果不想依赖列位置,也可以直接筛选带_email后缀的列,代码可读性更强:
region_list = ['ASEAN','INDIA','KOREA','ANZ'] for region in region_list: target_df = df1[df1['region'] == region] # 筛选所有包含'_email'的列 email_cols = [col for col in df1.columns if '_email' in col] # 提取邮箱并转成列表,过滤空值 email_list = target_df[email_cols].values.flatten().tolist() email_list = [email for email in email_list if pd.notna(email)] print(f"地区 {region} 的邮箱列表:{email_list}")
输出示例
运行后会得到每个地区的邮箱列表:
地区 ASEAN 的邮箱列表:['user1@gmail.com', 'user11@gmail.com', 'user111@gmail.com', 'user1111@gmail.com', 'user11111@gmail.com', 'user111111@gmail.com'] 地区 INDIA 的邮箱列表:['user3@gmail.com', 'user31@gmail.com', 'user311@gmail.com', 'user3111@gmail.com'] 地区 KOREA 的邮箱列表:['user4@gmail.com', 'user41@gmail.com', 'user411@gmail.com', 'user4111@gmail.com'] 地区 ANZ 的邮箱列表:['user2@gmail.com', 'user21@gmail.com', 'user211@gmail.com', 'user2111@gmail.com', 'user21111@gmail.com', 'user211111@gmail.com']
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

