iT邦幫忙

0

[python] 兩個Excell比較,最後合併成一個新的

  • 分享至 

  • xImage

請教IT邦的熱心高手,我有兩個Excell,
第1個是:comapre.xlsx https://www.dropbox.com/s/xem8b4ce9xd6rx0/compare.xlsx?dl=0
第2個是:main.xlsx https://www.dropbox.com/s/3i909pu76dbspdo/main.xlsx?dl=0

我想做的是以main.xlsx 這張表A欄位中的值跟Comapare.xlsx 裡面的A欄位值相比,
如果吻合就把comapre.xlsx 的其他欄位和A欄位一起寫進第3個Excell:link.xlsx ,不吻合就把不符合的兩個值用"->"連起來,像這樣 https://www.dropbox.com/s/535t2c4pnhbeskj/link.xlsx?dl=0

我Google找到的作法是用Pandas像是這樣:

import pandas as pd
import numpy as np
path = r"D:\x\Python_Study\Excell\\"
df1=pd.read_excel(path+'compare.xlsx')
df2=pd.read_excel(path+'main.xlsx')
df1.equals(df2)
comparison_values = df1.values == df2.values
print (comparison_values)
rows,cols=np.where(comparison_values==False)
for item in zip(rows,cols):
    df1.iloc[item[0], item[1]] = '{} --> {}'.format(df1.iloc[item[0], item[1]],df2.iloc[item[0], item[1]])
df1.to_excel('link.xlsx',index=False,header=True)

REF:https://kanoki.org/2019/02/26/compare-two-excel-files-for-difference-using-python/

但是會報錯:

d:\x\Python_Study\Excell\test0413.py:7: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  comparison_values = df1.values == df2.values
False
Traceback (most recent call last):
  File "d:\x\Python_Study\Excell\test0413.py", line 9, in <module>
    rows,cols=np.where(comparison_values==False)
ValueError: not enough values to unpack (expected 2, got 1)

請問我該往哪個方向修改? 或是有更好的做法。
需要的話我可以再描述清楚一點

謝謝IT邦的熱心網友願意花時間幫忙 好人一生平安

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2023-04-14 10:55:41 檢舉
1個1欄,另外一個3欄,你是要程式怎麼比對?

你需要的是merge:
https://blog.csdn.net/weixin_37226516/article/details/64137043
lalelee iT邦新手 4 級 ‧ 2023-04-14 11:11:53 檢舉
補充一下兩個EXCELL的列數是不同的
lalelee iT邦新手 4 級 ‧ 2023-04-14 11:16:43 檢舉
是 我需要的是比對以後再做merge. 謝謝
mackuo iT邦研究生 2 級 ‧ 2023-04-14 13:45:43 檢舉
請問compare.xlsx中A2儲存格是a.x.x.x,而main.xlsx中A2的儲存格是a.x.x,但比完的結果link.xlsx中卻是比對成功。這部份是資料誤繕?還是部份符合就寫到link.xlsx呢?
obarisk iT邦研究生 2 級 ‧ 2023-04-15 10:19:27 檢舉
merge 這個動作就包含比對了。可以先查這個 api 嗎...
lalelee iT邦新手 4 級 ‧ 2023-04-18 09:44:07 檢舉
查過的確有包含比對 感謝~!
lalelee iT邦新手 4 級 ‧ 2023-04-18 09:47:19 檢舉
@mackuo 是的, 的確是筆誤, link.xlsx 多打一個x 感謝~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
mackuo
iT邦研究生 2 級 ‧ 2023-04-14 15:10:19

樓主的資料有點簡化,以下的回答不曉得是不是能實際解決。

樓主的main.xlsx如下:

import pandas as pd

main = pd.DataFrame(data={'網址': ['a.x.x', 'b.x.x', 'd.x.x']})
main

https://ithelp.ithome.com.tw/upload/images/20230414/20122335qBmiBtij98.jpg

compare.xlsx如下:

compare = pd.DataFrame(data={'網址': ['a.x.x', 'b.x.x', 'c.x.x'],
                             '作業系統': ['win2012', 'win2019', 'linux'],
                             'WebServer版本': ['IIS 8', 'IIS10', 'Apache 2.2.4']
                            })
compare

https://ithelp.ithome.com.tw/upload/images/20230414/201223355YCD6iefFG.jpg

最後想要得到的link結果如下:

link = main.copy()
condition = link['網址']==compare['網址']
for i in compare.columns[1:]:
    link.loc[condition, i] = compare[i]

link.loc[~condition, '網址'] = link['網址'] + '->' + compare['網址']
link

https://ithelp.ithome.com.tw/upload/images/20230414/20122335msfc0MnnbP.jpg


以下是假設二個excel逐筆比對的解法:

main和compare如上一個解法中的資料。

先複製link後,將link和compare串接起來:

link = main.copy()
link = pd.concat([link, compare], axis=1)
link.columns = ['網址', 'compare網址', '作業系統', 'WebServer版本']
link

https://ithelp.ithome.com.tw/upload/images/20230414/20122335LeHoGAbXUL.jpg

import numpy as np
condition = link['網址']==link['compare網址']
for i in link.columns[2:]:
    link[i] = np.where(condition, link[i], np.nan) 

link.loc[~condition, '網址'] = link['網址'] + '->' + link['compare網址']

link = link.drop(columns='compare網址')
link

https://ithelp.ithome.com.tw/upload/images/20230414/20122335msfc0MnnbP.jpg

obarisk iT邦研究生 2 級 ‧ 2023-04-15 10:18:34 檢舉

講那麼多- -不就是 merge... 或是用 sql 說法 JOIN

lalelee iT邦新手 4 級 ‧ 2023-04-18 09:49:52 檢舉

@mackuo 感謝回答~ 直接用比對的比用Merge 難度高 謝謝

我要發表回答

立即登入回答