頁:
[1]
python csv資料比對問題
如題,最近想做csv參數比對,但不曉得往哪個方向做,不知道各位大大可以指點一下小的我嗎?用途:
用a.csv檔的Number欄位當KeyWord去搜尋b.csv檔是否存在,
在用 data1 ~ data6做資料比對,若data1 ~ data6其中1個資料不同,
則把2筆資料寫到c.csv檔。
a.csv
NAME DATE Number data1 data2 data3 data4 data5 data6
Kobe 2021/06/03 1 -------------- -------------- test1 10 80
Kobe 2021/06/03 1 -------------- -------------- test2 20 82
Kobe 2021/06/03 2 -------------- -------------- test3 20 96
Kobe 2021/06/03 2 -------------- -------------- test4 20 97
Kobe 2021/06/03 3 -------------- -------------- test5 10 129
Kobe 2021/06/03 3 -------------- -------------- test6 20 98
Kobe 2021/06/03 4 -------------- -------------- test7 10 916
b.csv
NAME DDATE Number data1 data2 data3 data4 data5 data6
Dragon 2021/06/03 1 -------------- -------------- test1 20 82
Dragon 2021/06/03 2 -------------- -------------- test2 20 96
Dragon 2021/06/03 4 -------------- -------------- test7 10 916
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div> 本帖最後由 tryit244178 於 2021-6-8 12:25 PM 編輯
簡單粗爆的方法就是,一行一行的比對。先把b的第一行,拿去跟a的第一、二、三、四、五……行比對;然後把b的第二行,拿去跟a的第一、二、三、四、五……行比對……以此類推。
用a.csv檔的Number欄位當KeyWord去搜尋b.csv檔是否存在。宣告一個list的變數,把b拿來跟a比對,如果Number的值相同,就push。
比對完後list就是有存在的資料。
在用 data1 ~ data6做資料比對,若data1 ~ data6其中1個資料不同。再宣告一個list的變數,比對data1 ~ data6的資料 (用簡單粗爆比對法),如果不同就push。
最後這個變數就是你要存成c的資料。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 我有點看不太懂需求,但你要不要試試看把兩個 csv 都倒進 sqlite db 裡面變成兩個 table,然後再把兩邊的 table join 起來? 先實作row的欄位成物件(model),然後將a.csv、b.csv的資料分別以model放到兩個list,分別是alist、blist,接著就迭代兩個list比對每一個物件的屬性就可以了 codewice 發表於 2021-6-19 09:49 PM static/image/common/back.gif
我有點看不太懂需求,但你要不要試試看把兩個 csv 都倒進 sqlite db 裡面變成兩個 table,然後再把兩邊的 t ...
講簡單一點就是 我想設條件去比對2個檔案的差異性,
把有差異性的資料列出來。<br><br><br><br><br><div></div> 本帖最後由 ilikeatom 於 2021-7-11 07:53 PM 編輯
import pandas as pd
import numpy as np
#用pandas載入資料
a = pd.read_csv("a.csv").fillna("none") #用文字的none取代空值是因為比較空值的時候會有nan不等於nan的問題
b = pd.read_csv("b.csv").fillna("none")
#以Nmber相同來合併資料
ab_merge = pd.merge(a,b,on = "Number",suffixes = ("_a","_b"))
#插入Nmber
ab_merge.insert(11,"Number_b",c.Number) #為了讓這張表的左右欄位都相同
ab_merge
NAME_aDATE_aNumberdata1_adata2_adata3_adata4_adata5_adata6_aNAME_bDATE_bNumber_bdata1_bdata2_bdata3_bdata4_bdata5_bdata6_b
Kobe2021/06/031none----------------------------test11080Dragon2021/06/031none----------------------------test12082
Kobe2021/06/031none----------------------------test22082Dragon2021/06/031none----------------------------test12082
Kobe2021/06/032none----------------------------test32096Dragon2021/06/032none----------------------------test22096
Kobe2021/06/032none----------------------------test42097Dragon2021/06/032none----------------------------test22096
Kobe2021/06/034none----------------------------test710916Dragon2021/06/034none----------------------------test710916
#轉成array,用forloop處理時的時間成本比較低
ab_merge_array = np.array(ab_merge)
ab_merge_array
array([['Kobe', '2021/06/03', 1, 'none', '--------------','--------------', 'test1', 10, 80, 'Dragon', '2021/06/03', 1,'none', '--------------', '--------------', 'test1', 20, 82],
['Kobe', '2021/06/03', 1, 'none', '--------------','--------------', 'test2', 20, 82,
'Dragon', '2021/06/03', 1,'none', '--------------', '--------------', 'test1', 20, 82],
['Kobe', '2021/06/03', 2, 'none', '--------------','--------------', 'test3', 20, 96,
'Dragon', '2021/06/03', 2,'none', '--------------', '--------------', 'test2', 20, 96],
['Kobe', '2021/06/03', 2, 'none', '--------------','--------------', 'test4', 20, 97,
'Dragon', '2021/06/03', 2,'none', '--------------', '--------------', 'test2', 20, 96],
['Kobe', '2021/06/03', 4, 'none', '--------------','--------------', 'test7', 10, 916,
'Dragon', '2021/06/03', 4,'none', '--------------', '--------------', 'test7', 10, 916]],dtype=object)
#將符合條件的資料放入c
c = []
for i in ab_merge_array: #loop
if all(i[3:9] == i[12:]) is False: #就是你要的條件,data1~data6有任何一個不相同
c.append(list(i[:9])) #把a表的資料丟到c
c.append(list(i[9:])) #把b表的資料丟到c
#轉成dataframe
pd.DataFrame(c,columns = a.columns)
NAMEDATENumberdata1data2data3data4data5data6
Kobe2021/06/031none----------------------------test11080
Dragon2021/06/031none----------------------------test12082
Kobe2021/06/031none----------------------------test22082
Dragon2021/06/031none----------------------------test12082
Kobe2021/06/032none----------------------------test32096
Dragon2021/06/032none----------------------------test22096
Kobe2021/06/032none----------------------------test42097
Dragon2021/06/032none----------------------------test22096
你只有用文字描述c表要什麼樣子,沒有實際的例子,所以我就用我對你的文字描述的認知來輸出結果
可以的話,下次把c表的結果弄出來,這樣才能確保別人回覆你的結果跟你想的會是一樣的
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
頁:
[1]