如何比较两个不同csv(旧csv和新csv)中的两列,并在旧csv中存在值时更新第三列

2024-06-16 13:43:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个CSV。第一个包含所有以前的客户的列表,并为其分配了ID。还有一个新的csv,我在其中自动生成ID,代码如下:

df['ID'] = pd.to_datetime('today').strftime('%m%d%y') + df.index.map(str)

OLD.csv

ID            FirstName   LastName
1             John        Smith
2             Jack        Ma
3             John        Wick
....          ....        ....
210906ABC3    Jon         Snow
210907ABC0    Peter       Parker
210907ABC1    Tony        Stark

使用当前脚本新建.csv

ID            FirstName   LastName
210908ABC0    Black       Widow
210908ABC1    Steve       Rogers
210908ABC2    John        Wick
210908ABC3    John        Rambo
210908ABC4    Tony        Stark

我需要比较csv中的FirstName和LastName列,如果客户已经存在于OLD.csv中,那么它应该采用OLD.csv中的ID值,而不是生成新ID

NEW.csv的预期输出

ID            FirstName   LastName
210908ABC1    Black       Widow
210908ABC2    Steve       Rogers
3             John        Wick
210908ABC3    John        Rambo
1             John        Smith

将来,我可能需要比较三列或四列,并且只在所有列都匹配的情况下分配ID。名字和姓氏以及(手机或地址)和(位置或SSN)


Tags: csviddf客户firstnamejohnoldsteve
1条回答
网友
1楼 · 发布于 2024-06-16 13:43:25

如果在两个数据帧df1和df2中都有两个文件,则可以合并这两个文件,然后更新第一个文件中的ID并仅打印第一个文件中的列,这将仅适用于多达几千行的文件,因为合并速度非常慢

df2.columns = [x + "_2" for x in df2.columns]  # to avoid auto renaming by pd
result = pd.merge(df1, df2, how='left', left_on = key_cols1, right_on = key_cols2)

# update the ID column
result.ID = np.where(result.ID_2.isnull(), result.ID, result.ID_2)

print(result.to_csv(index=False,columns=df1.columns))

编辑: 这是一个简单的工作示例,file1(df1)是要更新的文件,file2是包含要复制到file1的ID的文件

import pandas as pd, numpy as np, argparse, os

parser = argparse.ArgumentParser(description='update id in file1 with id from file2.')
parser.add_argument('-k', help='key column both file', required=True)
parser.add_argument('file1', help='file1 to be updated')
parser.add_argument('file2', help='file2 contains updates for file1')

args = parser.parse_args()
if not os.path.isfile(args.file1): raise ValueError('File does not exist: ' + args.file1)
if not os.path.isfile(args.file2): raise ValueError('File does not exist: ' + args.file2)

df1 = pd.read_csv(args.file1,dtype=str,header=0)
df2 = pd.read_csv(args.file2,dtype=str,header=0)
df2.columns = [x + "_2" for x in df2.columns]

key_col1 = [list(df1.columns)[int(x)] for x in args.k.split(",")]
key_col2 = [list(df2.columns)[int(x)] for x in args.k.split(",")]
result = pd.merge(df1, df2, how='left', left_on = key_col1, right_on = key_col2)

result.ID = np.where(result.ID_2.isnull(), result.ID, result.ID_2)

print(result.to_csv(index=False,columns=df1.columns))

使用方法如下:

$ python merge.py -k 1,2 file1.csv file2.csv

ID,FirstName,LastName
210908ABC0,Black,Widow
210908ABC1,Steve,Rogers
3,John,Wick
210908ABC3,John,Rambo
210907ABC1,Tony,Stark

确保每行的键是唯一的,否则您可以在输出文件中获得多个生成额外行的联接

相关问题 更多 >