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

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

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

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

pandas

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

Q&A

解決済

1回答

2409閲覧

python3 pandas 2つのCSVファイルで重複するデータ行を削除したい。For文で実行するとデータ数多くなるとエラー

dub

総合スコア24

Python

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

pandas

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

0グッド

0クリップ

投稿2021/10/22 03:47

#やりたい事。
POSレジのデータCSVがあります。現在既に登録されているPOSデータに、新規にデータを追加したいのですが

追加したいCSVのほうに既に登録されているバーコードを含む商品データが存在すると、登録時に「すでに登録されているバーコードが存在する為」エラーとなり、すべてのデータの追加がストップされてしまいます。
つまり重複するバーコードが追加する側に存在するとエラーになります。

そこで、商品データの追加作業をする前に、バーコードで判別して
☆「既存の商品データ.csv」のバーコード行が「追加する商品データCSV」のバーコード行に存在する場合、「追加する商品データCSV」側の重複データをあらかじめ削除したいと考えました。

#出来ない事
For文でそれぞれのCSVの15行目を検索して 一致する時は 追加する商品データCSV側のその行数番号の行を削除する。
このやり方で 一旦 出来たかに思えたのですが、
追加する商品データCSVが 5〜6行なら、思った動作(df_addに バーコードが一致する行を削除した状態)になるのですが、
データが多くなり10行以上になると KEYERRORになってしまいます

バーコード一致する行数を探して、削除する・・ 行数で探すのをfor文で回す間に、ズレてしまっているのでしょうか?
エラーの意味がまったくわからず・・エラーになる原因もわからないので(行数を増やしすとある所でエラーになりますが
その法則性が見つけることができませ。データが5行くらいだと動作できます

#注意点
すべての商品にバーコードが存在する訳ではないので、バーコードなしのデータを除いて重複を判別する必要があります。(バーコードでのみシステムは重複を判別している)

2つの商品CSVとも同じ配列で 15列目がバーコード列。ただし登録されたバーコードの先頭には#が付与されている。(追加する側のバーコードに#はない)

データフレームの結合になるとconcat になりますが、用途的に 重複していた場合に削除するデータを「追加する商品データCSV」に特定したいので、for文で1つずつ値を検索する方法で考えているのですが・・concatでもできればそれで構いません。

python

1import pandas as pd 2 3#追加する商品CSVデータをpandasに読み込み(既存データに含まれるバーコードが存在する場合はコチラを削除) 4df_add = pd.read_csv(filepath_or_buffer='追加する商品データ.csv',encoding="ms932",sep=",") 5 6#追加するデータの15列目の列名を変更する 7df_add[‘追加商品のバーコード列’]=df_add.iloc[:,15].str.replace('#','') 8 9#既存の商品データCSVファイルをpandasに読み込み 10df_already = pd.read_csv(filepath_or_buffer='既存の商品データ.csv',encoding="ms932",sep=",") 11 12#15行目がバーコード列でバーコードの値がなしのデータ行に「バーコード値なし」の文字列を入れる  13#既存のバーコード行に付与されている先頭の#を取り除く(追加データには先頭に先頭に#がないので形式を揃えるため) 14df_already.iloc[:,15]=df_already.iloc[:,15].fillna('バーコード値なし') 15 16 17#既存商品のデータでバーコードありの商品を抽出(「バーコード値がなし」以外の商品で新しくデータフレームを作成) 18df_already_is_barcode=df_already[df_already.iloc[:,15] !='バーコード値なし'] 19 20#既存商品の15列目のバーコード行を1つずつfor文で読み取りして、追加商品のバーコード列に値が一致すれば 21#追加商品データ側の重複バーコードを含む行を削除する 22 23#For文のネスト?をよく理解していないので分解して 値が1つとして式を作成 24 25for i,barcodelist in enumerate(df_already_is_barcode.iloc[:,15]): 26 27 for s,add_barcodelist in enumerate(df_add.iloc[:,15]): 28 if add_barcodelist == barcodelist: 29 print(s) 30 df_add=df_add.drop(s) 31 32 33print(df_add) 34

KeyError Traceback (most recent call last)
/var/folders/mh/7nc68w255sbghw6jtc23zks00000gn/T/ipykernel_2192/1482103320.py in <module>
29 if add_barcodelist == barcodelist:
30 print(s)
---> 31 df_add=df_add.drop(s)
32
33

~/miniforge3/lib/python3.9/site-packages/pandas-1.3.0.dev0+1626.g40482273cd-py3.9-macosx-11.0-arm64.egg/pandas/core/frame.py in drop(self, labels, axis, index, columns, level, inplace, errors)
4870 weight 1.0 0.8
4871 """
-> 4872 return super().drop(
4873 labels=labels,
4874 axis=axis,

~/miniforge3/lib/python3.9/site-packages/pandas-1.3.0.dev0+1626.g40482273cd-py3.9-macosx-11.0-arm64.egg/pandas/core/generic.py in drop(self, labels, axis, index, columns, level, inplace, errors)
4157 for axis, labels in axes.items():
4158 if labels is not None:
-> 4159 obj = obj._drop_axis(labels, axis, level=level, errors=errors)
4160
4161 if inplace:

~/miniforge3/lib/python3.9/site-packages/pandas-1.3.0.dev0+1626.g40482273cd-py3.9-macosx-11.0-arm64.egg/pandas/core/generic.py in _drop_axis(self, labels, axis, level, errors)
4192 new_axis = axis.drop(labels, level=level, errors=errors)
4193 else:
-> 4194 new_axis = axis.drop(labels, errors=errors)
4195 result = self.reindex(**{axis_name: new_axis})
4196

~/miniforge3/lib/python3.9/site-packages/pandas-1.3.0.dev0+1626.g40482273cd-py3.9-macosx-11.0-arm64.egg/pandas/core/indexes/base.py in drop(self, labels, errors)
5986 if mask.any():
5987 if errors != "ignore":
-> 5988 raise KeyError(f"{labels[mask]} not found in axis")
5989 indexer = indexer[~mask]
5990 return self.delete(indexer)

KeyError: '[3] not found in axis'

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

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

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

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

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

guest

回答1

0

ベストアンサー

削除するのではなく、以下のように既存データに存在しないコードの行のみ抽出すればよいです。

Python

1import pandas as pd 2 3df_add = pd.DataFrame({'Code':[1,2,3,4], 'Val':list('abcd')}) 4df_alr = pd.DataFrame({'Code':[2,4,5], 'Val':list('ABC')}) 5 6df_ret = df_add[ ~df_add['Code'].isin(df_alr['Code'])] 7print(df_ret) 8# Code Val 9#0 1 a 10#2 3 c

投稿2021/10/22 04:24

can110

総合スコア38341

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

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

dub

2021/10/22 08:42

ありがとうございます!チルダ isin ともに知りませんでした。pandasってこんな便利な関数があったんですね。。 pandasはあまり使った事がなかったので相当に考えて、自分の知ってる関数だけで処理しようとしていましたが、色々なデータ抽出方法があると知れて本当に勉強になりました!感謝です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問