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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:20:43