伊莉討論區

標題: python csv資料比對問題 [打印本頁]

作者: 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
NAMEDATENumberdata1data2data3data4data5data6
Kobe2021/06/031----------------------------test11080
Kobe2021/06/031----------------------------test22082
Kobe2021/06/032----------------------------test32096
Kobe2021/06/032----------------------------test42097
Kobe2021/06/033----------------------------test510129
Kobe2021/06/033----------------------------test62098
Kobe2021/06/034----------------------------test710916


b.csv
NAMEDDATENumberdata1data2data3data4data5data6
Dragon2021/06/031----------------------------test12082
Dragon2021/06/032----------------------------test22096
Dragon2021/06/034----------------------------test710916






作者: 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的資料。


作者: 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
我有點看不太懂需求,但你要不要試試看把兩個 csv 都倒進 sqlite db 裡面變成兩個 table,然後再把兩邊的 t ...

講簡單一點就是 我想設條件去比對2個檔案的差異性,
把有差異性的資料列出來。
作者: 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_a

DATE_a

Number

data1_a

data2_a

data3_a

data4_a

data5_a

data6_a

NAME_b

DATE_b

Number_b

data1_b

data2_b

data3_b

data4_b

data5_b

data6_b

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



#轉成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)

NAME

DATE

Number

data1

data2

data3

data4

data5

data6

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



你只有用文字描述c表要什麼樣子,沒有實際的例子,所以我就用我對你的文字描述的認知來輸出結果
可以的話,下次把c表的結果弄出來,這樣才能確保別人回覆你的結果跟你想的會是一樣的















歡迎光臨 伊莉討論區 (http://www4.eyny.com/) Powered by Discuz!