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

如何用Pandas对比CSV两列数据并生成差异值新列?

用Pandas实现CSV列对比生成新列

原始CSV文件内容

Email Invite                    Email Denied                                                                                       
batman@email.com                batman@email.com                       
poisonivy@email.com             catgirl@email.com             
superman@email.com              supergirl@email.com           
catgirl@email.com                           
joker@email.com                             
supergirl@email.com   

需求说明

对比Email Invite和Email Denied两列,生成名为Emails Left的新列,包含所有未出现在Email Denied列中的邮箱(示例中额外包含了flash@email.com,需支持此类新增邮箱的添加)。

现有待完善代码

import pandas as pd

Dir='invites.csv'

df = pd.read_csv(Dir)
df = pd.DataFrame(df)

a = len(df['Email invite'])
aList = []

for i in range(a):
    if df['Email invite'][i] != df['Email Denied'][i]:
        aList.append(df['Email Invite'][i])  

#place list as third column df['Emails Left']

修正后的完整代码

import pandas as pd

# 读取CSV文件,原文件为多空格分隔,用sep='\s+'正确识别列
df = pd.read_csv('invites.csv', sep='\s+', header=0)

# 获取Email Denied列的非空邮箱集合,用于快速判断
denied_emails = set(df['Email Denied'].dropna())

# 筛选Email Invite中未出现在拒绝列表里的邮箱
left_emails = df['Email Invite'].dropna()[~df['Email Invite'].dropna().isin(denied_emails)].tolist()

# 添加示例中的额外邮箱(按需添加)
left_emails.append('flash@email.com')

# 将筛选结果填充到新列,行数不足时自动留空
df['Emails Left'] = pd.Series(left_emails).reindex(df.index)

# 把新增邮箱追加到Email Invite列末尾,匹配示例输出格式
df = df._append({'Email Invite': 'flash@email.com'}, ignore_index=True)

# 查看最终结果
print(df)

代码说明

  1. 文件读取:用sep='\s+'处理多空格分隔的CSV,避免列识别混乱;
  2. 筛选逻辑:通过集合快速判断邮箱是否在拒绝列表中,替代逐行对比的低效逻辑;
  3. 列填充:用reindex保证新列长度与原表一致,空缺位置自动留空;
  4. 行追加:通过_append添加示例中的额外邮箱行,匹配需求输出的格式。

内容的提问来源于stack exchange,提问作者noobCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:27