EXCEL内のデータの重複、差分を取ろう

投稿者: | 2021年5月12日

エクセルやCSVデータで特許データを処理する際にデータの重複や差分を知りたいということがよくあると思います。エクセル自体にもそのための機能があるのかもしれませんがいまいち使い勝手がよくないと感じている方も多いのではないでしょうか。

pythonではエクセルやCSVの読み込みができ、集合の演算も簡単にできるためそうした処理が簡単に実装できます。
最初動作するまでは若干理解するのに努力が必要ですが、いったん作成してしまえばあとは自動で処理できますし、自身の好みにカスタマイズすることもできます。

是非この記事を参考にして試してみてください。記事内のプログラムをそのまま利用するだけでも仕事の効率化は可能だと思います。

処理対象のサンプルエクセルデータ

最初に処理対象とするエクセルデータを読み込みます。読み込み対象とするデータは以下にサンプルを提供しますのでダウンロードしてください。もちろん自身で処理したいデータがあればそれでOKです。ただしデータの形式はそろえてください。

以下のサンプルデータは2010年以後のゴルフクラブに関する特許出願500件のデータです。このデータに基づいてデータの処理方法を説明します。各場面で適宜わかりやすくするために、処理対象の項目だけのデータを抽出して説明します。

このデータには公報番号をはじめとして各書誌事項が含まれています。もちろんこのまま処理してもよいのですが、項目が多く、説明の時にわかりにくくなるので筆頭出願人データのみを抽出した以下のデータを使用することとします。以下をダウンロードして任意のフォルダにおいてください。

ゴルフデータ_出願人:単純に出願人が並んだだけのデータです

pythonでエクセルデータを読み込む

まずはpythonで上記のエクセルデータを読み込みます。pythonの動作環境はjupyter notebookを前提で説明します。jupyter notebookの導入、起動方法については以前の記事を参考にしてください。

<pythonの実効環境について> https://rise-pat.com/python_ip/2021/01/27/anaconda/

エクセルファイルを読み込むにはライブラリのopenpyxlが必要になります。ライブラリを導入されていない方はインストールが必要になります。コード内に該当箇所を1行記載しています。詳しく知りたい方は以下のサイトが参考になりますのでご参照ください。

【PythonでExcelを操作】OpenPyXLのインストールから実行まで https://cafe-mickey.com/python/openpyxl-1/

ではまずは実際のコードでエクセルの該当列を読み込んでみましょう。jupyter上で以下のコードを入力します。
以下の例は私の環境上(Windows)なので適宜自身の環境に置き換えて実行してください。

# openpyxl がインストールされていない方は以下を実行(コメントアウトを外す)
# !pip install openpyxl

import openpyxl

# エクセルファイルのパス(置き場所)を指定します。自身の環境に合わせてください。
workbook = openpyxl.load_workbook(r'C:\python_ip\20210515\ゴルフデータ_筆頭出願人.xlsx')

# 先頭のシートを取得
worksheet = workbook.worksheets[0]

# 入力された最終行を取得
max_row =worksheet.max_row

# データのセルを取得
cells = worksheet['A1':'A'+str(max_row)]

# 出願人のリストを用意
assignees = []

for c in cells:
    assignees.append(c[0].value) #セルの値を順次追加

print(assignees)

上記のコードで出願人のリストが取得できます。jupyter 上では以下のようにリストの内容が表示されます。

データの重複を除去する

現状は出願人には重複があります。今一番勢いのあるPINGのメーカーである「カーステン マニュファクチャリング コーポレーション」が多いのが目立ちますね。

それでは重複を除くことにします。前のコードのprint(assignees)の前に以下の処理を追記してください。

for c in cells:
    assignees.append(c[0].value) #セルの値を順次追加

### ここが追記部分
assignees = list(set(assignees))

print(assignees)

これを実行すると重複が除去された出願人が表示されます。

重複のなくなった出願人リスト

重複の除去にはpythonの標準モジュールのデータ型であるsetを利用しました。これは集合を表すデータ型でデータ内の重複は除かれます。またこれにより他のset型のデータとの集合演算が可能となります。

またset型を使わずに重複のないリストを作ることができます。assigneeのリストに追加する際にすでにあるかどうかをチェックするわけです。プログラムの練習にもなるのでその方法も掲載します。

# 出願人のリストを用意
assignees2 = []

for c in cells:
    if c[0].value not in assignees2:
        assignees2.append(c[0].value) #セルの値を順次追加

print(assignees2)

結果は省略しますが是非実行して違いを確認してください。データの内容は同じなのですが並び順が異なるかと思います。これはset型はデータの順序が保証されないという特徴のためです。

まとめ

今回は単一のカラムの重複を除去する方法を説明しました。是非ご自身のデータでも試してみてください。
エクセルを読み込んでデータを作成するまでがややこしいかもしれませんが、いったん作成してしまえば次からは同じ動作なので楽になるはずです。次回は読み込んだデータを使って複数カラム間の重複や差分の取得について説明します。

本稿ではあらゆる詳細の事項を説明しているわけではないので、以下に参考あるいは説明の補助になるリンクを掲載します。合わせて参照していただけると理解が深まるかと思います。

【PythonでExcelを操作】OpenPyXLのインストールから実行まで https://cafe-mickey.com/python/openpyxl-1/

Python, set型で集合演算 https://note.nkmk.me/python-set/

OpenPyXLで複数のセルの値を取得する方法 https://tonari-it.com/python-openpyxl-beginner-2/

【Python】Excelのデータをすべて取得する方法 https://pg-chain.com/python-excel-data

openpyxl tutorial https://openpyxl.readthedocs.io/en/stable/tutorial.html?highlight=cell%20value#accessing-one-cell