如何用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)
代码说明
- 文件读取:用
sep='\s+'处理多空格分隔的CSV,避免列识别混乱; - 筛选逻辑:通过集合快速判断邮箱是否在拒绝列表中,替代逐行对比的低效逻辑;
- 列填充:用
reindex保证新列长度与原表一致,空缺位置自动留空; - 行追加:通过
_append添加示例中的额外邮箱行,匹配需求输出的格式。
内容的提问来源于stack exchange,提问作者noobCoder
相关产品推荐
相关产品推荐

