我是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
我找到了文件比较脚本,但找不到这种类型的东西。
答案 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
个空数据框
然后我只是更新来自df3
和df1
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_Sdf1["EMP_LOCATION_S"] = df1["EMP_NAME_S"] == df2["EMP_NAME_T"]