#やりたい事。
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'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/22 08:42