查看完整版本: python csv資料比對問題
頁: [1]

ayabreay1 發表於 2021-6-6 03:42 PM

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:20 PM

本帖最後由 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>

codewice 發表於 2021-6-19 09:49 PM

我有點看不太懂需求,但你要不要試試看把兩個 csv 都倒進 sqlite db 裡面變成兩個 table,然後再把兩邊的 table join 起來?

albertalan 發表於 2021-6-22 09:41 AM

先實作row的欄位成物件(model),然後將a.csv、b.csv的資料分別以model放到兩個list,分別是alist、blist,接著就迭代兩個list比對每一個物件的屬性就可以了

ayabreay1 發表於 2021-6-25 06:59 PM

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 02:13 PM

本帖最後由 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]