質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

1回答

1659閲覧

python csvファイル2つ(元・追加)で特定の2つの列で元ファイルに値が重複しない追加ファイルの行だけを元ファイルに追記したい

dub

総合スコア24

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/07/24 04:07

編集2021/07/24 10:39

レジの商品データファイルがあります。
元データは、バーコード行(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行ずつ取り出す方法がわからない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/07/24 04:52 編集

りんごのバーコドが「#111111」と「111111」と2種類存在していますが、実際のデータがそうなっているのでしょうか?コピーミスでしょうか? ⇒ 実際のデータがそうなっていると記載がありましたね。見落としておりました。
guest

回答1

0

Python

1import pandas as pd 2 3df1 = pd.DataFrame({'商品名':['りんご','みかん','バナナ','メロン'],'JANコード':['#111111','#222222','バーコードなし','#444444']}) 4df2 = pd.DataFrame({'商品名':['きゅうり','りんご','バナナ','なす'],'JANコード':['5555555','111111','バーコードなし','666666']}) 5df2['JANコード'] = df2['JANコード'].apply(lambda x: '#'+x if x != 'バーコードなし'else 'バーコードなし') 6df3 = pd.concat([df1,df2]) 7df3 = df3.drop_duplicates() 8#print(df3) 9# 商品名 JANコード 10#0 りんご #111111 11#1 みかん #222222 12#2 バナナ バーコードなし 13#3 メロン #444444 14#0 きゅうり #5555555 15#3 なす #666666

※バーコードは先頭に「#」が付いているものに合わせました。付いてないものに統一したい場合はapply()の処理を適宜変更してください。

【コメントに対する回答】
pandas.DataFrame.drop_duplicatesにはsubsetというパラメーターがあります。こちらを使用すれば良いかと思います。詳しくはドキュメントを参照ください。

投稿2021/07/24 05:06

編集2021/07/24 06:00
meg_

総合スコア10749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dub

2021/07/24 05:55

ありがとうございます!しかしデータの前提で定義をしっかりお伝えできていませんでした。 drop_duplicates() だと、行のデータが完全に一致しないと削除されないと思うのですが、 実際には、JANコードは一緒でも、商品名が微妙に違ったりしていました(元データと追加データで 表記が異なる事がある) たとえば 元データでは  りんご #111111 なのが 追記データでは アップル 111111  とJANだけが一致して名前は異なる場合もあります。 なので JANコードだけをまず参照して、重複のチェックをしたいとなると、drop_duplicates()では難しいのではないかと・・思ったのですが・・ あと、元データ.csv にも 追加データ.csv にも 見出し行が存在しないので、列数でデータの位置を指定したいのですが・・
meg_

2021/07/24 06:05

> あと、元データ.csv にも 追加データ.csv にも 見出し行が存在しないので、列数でデータの位置を指定したいのですが・・ 私ならコード中で見出しを追加します。それをしたくないのであればiloc()等を使用してカラム番号で指定すれば良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問