【初心者向け】Pandasデータ結合入門 merge、join、concat の違いを解説!

はじめに

Pandasを使ってデータ分析をする際に避けて通れないのが、データセットの結合です。
ただ、Pandasにはデータ結合のためのメソッドとして、mergejoinconcatの3つのメソッドが提供されています。Pandasを学び始めたばかりの初学者の方ですと、これらのどれを使えば良いのか、使い分けがわからないという問題に直面することがあります。そのため本記事では、これらのメソッドの違いと、どのような時に使うべきかを初学者向けに解説します。

merge

mergeメソッドはSQLの結合操作に非常に似ており、主に異なるデータフレーム間で共通の列またはインデックスを基にデータを結合します。最も一般的な使い方は、共通の”キー”列を指定して2つのデータフレームを結合することです。mergeは、内部結合、左結合、右結合、外部結合など、複数の結合方法をサポートしています。

mergeのサンプルプログラム

import pandas as pd

# データフレームを作成
df1 = pd.DataFrame({'ID': [1, 2, 3, 4],
                    '製品': ['A', 'B', 'C', 'D']})
df2 = pd.DataFrame({'ID': [2, 3, 4, 5],
                    '価格': [300, 150, 600, 50]})

# ID列をキーとしてmergeを使用
merge_result = pd.merge(df1, df2, on='ID')
merge_result

join

joinメソッドは、主にインデックスを基にデータフレームを結合します。mergeと同様に、様々な結合方法をサポートしていますが、joinはデフォルトでインデックスを結合キーとして使用し、列を指定することも可能です。このメソッドは、特にインデックスベースでのデータ結合を行いたい場合に便利です。

joinのサンプルプログラム

import pandas as pd

# インデックスを使用してデータフレームを結合
df1 = pd.DataFrame({'製品': ['A', 'B', 'C', 'D']},
                   index=[1, 2, 3, 4])
df2 = pd.DataFrame({'価格': [300, 150, 600, 50]},
                   index=[2, 3, 4, 5])

# df1にdf2をjoin
join_result = df1.join(df2, how='inner')
join_result

concat

concatメソッドは、軸を指定してシンプルにデータフレームやシリーズを結合します。主に、同じ構造のデータを縦(行方向)または横(列方向)に連結したい場合に使用されます。ただし、concatは、細かな結合処理に適していません。 以下はサンプルプログラムです。

concatのサンプルプログラム

import pandas as pd

df1 = pd.DataFrame({'製品': ['A', 'B'],
                    '価格': [100, 200]})
df2 = pd.DataFrame({'製品': ['C', 'D'],
                    '価格': [300, 400]})

# concatを使用
concat_result = pd.concat([df1, df2], axis=0)  # 縦(行)方向 に連結
concat_result

concatの引数axisについて

concatの引数axisですが、結合する方向を指定します。デフォルトで初期値0が渡されます。0もしくは1を明示的に指定でき、デフォルト0では縦方向に連結します。

縦(行)方向はデータフレームの下にくっつけるイメージで、横(列方向)は右にくっつけるイメージです。以下に詳細に説明します。

縦方向 (axis=0)と横方向 (axis=1)の違いとイメージ

縦(行)方向 (axis=0)
ここで言う「縦方向」は、データフレームに新しい行を追加する操作を指します。すなわち、複数のデータフレームを上から下へ(縦に)連結します。これにより、データフレームの行数が増えますが、列数は増えません(列名が同じ場合)。この操作は、同じ種類のデータを時間軸などで続けて並べたい場合によく使われます。

横(列)方向 (axis=1)
一方で「横方向」とは、データフレームに新しい列を追加する操作を指します。つまり、複数のデータフレームを左から右へ(横に)連結します。これにより、データフレームの列数が増えますが、行数はそのままです。この操作は、異なる特徴を持つデータセットを横に拡張して一つの大きなデータセットに統合したい場合に適しています。

以下は縦(行)方向 (axis=0)と横(列)方向 (axis=1)の図です。

まとめ

この記事では、Pandasでデータ結合を行う3つのメソッド(merge、join、concat)の違いを解説しました。

以下に本記事で説明した内容をまとめます。

いつどれを使うか

merge
異なるデータフレームの共通の列(またはインデックス)を基にした複雑な結合が必要な場合に使用。特に、特定の条件に基づいて結合するレコードを厳密に制御したい時に適しています。

join
主にインデックスに基づいた結合を行いたい場合に使用。特に複数のデータフレームを効率的に結合したい時に便利です。列に基づく結合も可能です。

concat
単純に複数のデータセットを縦(同じ列を持つデータフレームの結合)または横(同じ行を持つデータフレームの結合)に連結したい場合に利用。結合キーの指定は不要で、データセットの拡張に焦点を当てています。

本記事が少しでもお役に立てれば幸いです。

データ分析やPythonを効率良く学びたい方へ

独学で機械学習やデータ分析、統計学を独学で学ぶのは大変です。 そのような方には、AI Academy Bootcamp がおすすめです。

AI Academy Bootcampでは6ヶ月データサイエンティストや機械学習エンジニアに質問し放題でありながら、目指す上で必要なスキルを体系的に学べる動画コンテンツで学べます。また受講料も6ヶ月間の受講で35,000(税込)でご受講出来ます。
独学での学習に限界を感じられた方は是非ご活用ください!