レジの商品データファイルがあります。
元データは、バーコード行(15列目)で重複チェックされているデータなのでバーコードの重複がないCSVデータです。
その元データ.csv(2000行くらい)に 追加データ.csv(大抵10行)を頻繁に追記・結合する場面があるのですが、
結合時にデータが知らない間に重複してしまうのを避けるため、追加データを1行ずつ取得して、その値が 元データを参照して、同じ値が存在しない行だけを、元データに1行ずつ追記したいと考えました。
元データ.csvと追加データ.csvは同じ配列(並び順)です。
重複チェックで参照したい列は 商品名(4列目)とJANコード列(15列目)です
元ファイル.csv(3000行ほど)
(元ファイルのJANコードには行頭に#がついています)
列4(商品名) | 列15(JANコード) |
---|---|
りんご | #111111 |
みかん | #222222 |
バナナ | バーコードなし |
メロン | #444444 |
追加ファイル.csv
(りんご、バナナが元のファイルと重複している。
りんごのように元データでりんご、追加データでアップルと商品名が異なる場合もあるのがJANコードが重複していればスキップしたい(行の完全一致ではないので、pandas のdrop_duplicatesでは難しいかも・・)
列4(商品名) | 列15(JANコード) |
---|---|
きゅうり | 5555555 |
アップル | 111111 |
バナナ | バーコードなし |
なす | 666666 |
##追記後のファイルイメージ
結合したい(元ファイルに追記したい)
きゅうり、なす の重複していない行のみを元ファイルに追記したい(順次保存)
バーコードで重複チェックだけだと
バーコードが存在しないデータ(バナナ)が重複する可能性があるため
名前での一致でも重複したデータはスキップしたいです
列4(商品名) | 列15(JANコード) |
---|---|
りんご | #111111 |
みかん | #222222 |
バナナ | バーコードなし |
メロン | #444444 |
きゅうり | 5555555 |
なす | 666666 |
##構成 1行ずつチェックするか 集合?から重複チェックするのか?
for文で 追記ファイルの値を1つずつ 元ファイルに存在するかチェックして、存在すれば continueでスキップして、存在しなければ、CSVに追記する
と考えて色々ためしてわからなかったのですが
調べているうちに set 集合を使ったほうが早いとの記事を読んで余計にわからなくなってしまいました
##わからないところ
・参照列(4列目、15列目でそれぞれ重複する値を除きたい)はどうやって指定するのか・・
・JANコード列(15列目)で元ファイルには JANコードの行頭に#が付与されていて、追加ファイルには数字のみ と微妙に異なるのをどのように判断すればいいのか
(重複行のりんごのJANは元ファイルは #111111 で追加ファイルには#がない 111111)
・そもそも1行ずつ 値を参照するのか、列全体から参照すればいいのか・・
pandasは 本当に初心者でわからないところばっかりなんで申し訳ありませんが何卒ヒントをいただけないでしょうか・・
python
1import pandas as pd 2 3df1 = pd.read_csv("./元データ.csv", encoding="cp932",header=None) 4df2 = pd.read_csv("./追加データ.csv", encoding="cp932",header=None) 5 6import csv 7 8save_csv='./元データ.csv' 9for x in df2.iloc[:, 15]: 10 if x in df1.iloc[:, 15]: 11 continue 12 13 else: 14 with open(df1, 'a',encoding ='cp932') as f: 15 writer = csv.writer(f) 16 writer.writerow(df2.iterrows())#xが含まれる行を1行ずつ取り出す方法がわからない