如何统计DataFrame中指定邮件地址的出现次数?
如何统计指定邮件列表在DataFrame中的出现次数?
嗨,我来帮你搞定这个问题!首先明确说一句:优先用pandas的内置矢量化方法,循环不仅代码写起来麻烦,数据量大的时候运行效率会差很多。下面一步步给你演示最优解法,也会补充循环的正确写法(如果你确实需要的话)。
第一步:准备示例数据
先把你的DataFrame和目标列表还原出来:
import pandas as pd # 构造你的示例DataFrame data = { 'From': ['person1@gmail.com', 'person2@gmail.com', 'person3@gmail.com'], 'To': ['stranger1@gmail.com', 'stranger1@gmail.com, stranger2@gmail.com', 'person1@gmail.com, stranger2@gmail.com'] } df = pd.DataFrame(data) # 指定需要统计的邮箱列表 lst = ['person1@gmail.com', 'stranger2@gmail.com', 'person3@gmail.com']
第二步:用pandas内置方法实现统计
核心思路是把所有涉及的邮箱(From列 + 拆分后的To列)合并成一个序列,然后统计次数再过滤目标列表:
# 1. 拆分To列中用逗号分隔的邮箱,展开成单独的行 to_emails = df['To'].str.split(', ', expand=True).stack().reset_index(drop=True) # 2. 把From列和处理后的To列合并成一个包含所有邮箱的序列 all_emails = pd.concat([df['From'], to_emails], ignore_index=True) # 3. 统计每个邮箱的出现次数 email_counts = all_emails.value_counts() # 4. 按照目标列表过滤并整理成你需要的格式 result = email_counts.reindex(lst).reset_index() result.columns = ['list_item', 'Total_Count'] # 查看结果 print(result)
运行后会得到你期望的输出:
list_item Total_Count 0 person1@gmail.com 2 1 stranger2@gmail.com 2 2 person3@gmail.com 1
如果你一定要用循环实现
你的原循环有语法错误(比如if To,From contains item in emails:是不符合Python语法的),下面是修正后的循环写法:
from collections import defaultdict # 用字典来存计数 count_dict = defaultdict(int) # 遍历DataFrame的每一行 for _, row in df.iterrows(): # 处理From列的邮箱,如果在目标列表里就计数+1 from_email = row['From'] if from_email in lst: count_dict[from_email] += 1 # 拆分To列的邮箱,逐个检查计数 to_emails = row['To'].split(', ') for email in to_emails: if email in lst: count_dict[email] += 1 # 转换成你需要的DataFrame格式 result_df = pd.DataFrame({ 'list_item': lst, 'Total_Count': [count_dict[item] for item in lst] })
不过还是强烈建议用第一种pandas内置方法,尤其是当你的DataFrame行数很多的时候,矢量化操作的速度会比循环快几个数量级。
内容的提问来源于stack exchange,提问作者OfSorts
相关产品推荐
相关产品推荐

