用于CSV文件比较的Python脚本

时间:2017-06-27 04:20:49

标签: python

我是Python新手,目前正致力于创建数据比较脚本。我有以下格式的两个文件

CSV1(来源系统)

EMP_ID, EMP_NAME, EMP_LOCATION
1,Sam J, Houston
2,Man T, Houston
3,Sub D, Chicago
4,Saggie D, New York

CSV2(迁移/定位)

EMP_ID, EMP_NAME, EMP_LOCATION
1,Sam J, Houston£$@£
2,Man T, Houston
3,Sub D, Chicago
4,Saggie D, New York^^^

我希望比较结果是这样的

EMP_ID_S, EMP_ID_T, EMP_ID_STATUS, EMP_NAME_S, EMP_NAME_T, EMP_NAME_STATUS, EMP_LOCATION_S, EMP_LOCATION_T, EMP_LOCATION_STATUS

1,1,Matched,Sam J, Sam J, Matched, Houston, Houston£$@£, Not Matched
4,4,Matched,Saggie D, Saggie D, New York, New York^^^, Not Matched

我找到了文件比较脚本,但找不到这种类型的东西。

2 个答案:

答案 0 :(得分:0)

在这里,我提供了完整的解决方案,我将解释这些概念。

import pandas as pd


index_list = ['EMP_ID_S', 'EMP_ID_T', 'EMP_ID_STATUS',
              'EMP_NAME_S', 'EMP_NAME_T', 'EMP_NAME_STATUS',
              'EMP_LOCATION_S', 'EMP_LOCATION_T',
              'EMP_LOCATION_STATUS']

common_list  = ['EMP_ID','EMP_NAME','EMP_LOCATION']
update1_list = list(zip(['EMP_ID_S','EMP_NAME_S','EMP_LOCATION_S'],common_list))

update2_list = list(zip(['EMP_ID_T','EMP_NAME_T','EMP_LOCATION_T'],common_list))




df1 = pd.read_csv("file1.csv")
df2 = pd.read_csv("file2.csv")
df3 = pd.DataFrame(list(range(4)),columns=['EMP_ID'])
df3=df3.reindex(columns=index_list)


for item in update1_list:
    df3[item[0]] = df1[item[1]]
for item in update2_list:
    df3[item[0]] = df2[item[1]]   

df3[['EMP_ID_STATUS','EMP_NAME_STATUS','EMP_LOCATION_STATUS']]='Not Matched'



df1.loc[(df1['EMP_ID'] == df2['EMP_ID']),'EMP_ID_STATUS'] = 'Matched'
df1.loc[(df1['EMP_NAME'] == df2['EMP_NAME']),'EMP_NAME_STATUS'] = 'Matched'
df1.loc[(df1['EMP_LOCATION'] == df2['EMP_LOCATION']),'EMP_LOCATION_STATUS'] = 'Matched'

df3.update(df1)
print(df3)

输出:

   EMP_ID_S  EMP_ID_T EMP_ID_STATUS EMP_NAME_S EMP_NAME_T EMP_NAME_STATUS  \
0         1         1       Matched      Sam J      Sam J         Matched   
1         2         2       Matched      Man T      Man T         Matched   
2         3         3       Matched      Sub D      Sub D         Matched   
3         4         4       Matched   Saggie D   Saggie D         Matched   

  EMP_LOCATION_S EMP_LOCATION_T EMP_LOCATION_STATUS  
0        Houston    Houston£$@£         Not Matched  
1        Houston        Houston             Matched  
2        Chicago        Chicago             Matched  
3       New York    New York^^^         Not Matched

首先,我使用df3=df3.reindex(columns=index_list)

中的列创建了index_list个空数据框

然后我只是更新来自df3df1

df2中的列
    for item in update1_list:
        df3[item[0]] = df1[item[1]]
    for item in update2_list:
        df3[item[0]] = df2[item[1]

注意[('EMP_ID_S', 'EMP_ID'), ('EMP_NAME_S', 'EMP_NAME'), ('EMP_LOCATION_S', 'EMP_LOCATION')]list(zip([['EMP_ID_T','EMP_NAME_T','EMP_LOCATION_T'],update1_list))之后每个项目的输出[0]

EMP_ID_T df3 [item [0]] - > df3 ['EMP_ID_T'] 设置为 df1 [item [1]] - > df1 ['EMP_ID'] 。所以每个值都会更新。

这就是你想要的,

df1.loc[(df1['EMP_ID'] == df2['EMP_ID']),'EMP_ID_STATUS'] = 'Matched'
仅当符合df1.loc条件时,

EMP_ID_STATUS才会将'Matched'列设置为df1['EMP_ID'] == df2['EMP_ID']。所以对其他人也一样,你有你想要的东西。

答案 1 :(得分:-1)

听起来有点奇怪,但你可以使用pandas

df1 = pd.read_csv('../data/example1.csv')
df2 = pd.read_csv('../data/example2.csv')

然后在id列上加入2个不同的Dataframe。然后,您可以使用

创建新列作为EMP_LOCATION_S
df1["EMP_LOCATION_S"] = df1["EMP_NAME_S"] == df2["EMP_NAME_T"]