Pandasで学ぶデータ結合:MergeとConcatを使いこなす入門
データ分析におけるデータ結合の重要性
データ分析を進める上で、扱うデータは単一のファイルやテーブルから得られるとは限りません。多くの場合、異なるソースから収集された複数のデータを組み合わせる必要があります。例えば、顧客リストと購買履歴、製品情報と販売データなど、別々の場所に保管されている情報を関連付けて分析することで、より深い洞察を得ることが可能になります。
このような複数のデータを一つにまとめる作業を「データ結合」または「データ連結」と呼びます。これはデータ分析の最初のステップである「データ前処理」において非常に重要なプロセスです。適切にデータを結合・連結することで、分析の準備が整い、次のステップへとスムーズに進むことができます。
この記事では、Pythonの強力なデータ分析ライブラリであるPandasを使用して、複数のデータを結合・連結する基本的な方法を解説します。特に、実務で頻繁に利用されるmerge
関数とconcat
関数に焦点を当て、それぞれの使い方と使い分けについて、具体的なコード例を交えながら説明します。
Pandasにおけるデータ結合・連結の主要関数
Pandasには、データを結合・連結するためのいくつかの関数が用意されていますが、主に使われるのは以下の二つです。
pd.merge()
: 特定のキー(共通する列の値)に基づいて、二つのデータフレームを結合します。これはリレーショナルデータベースにおけるJOIN操作に似ています。pd.concat()
: 複数のデータフレームを単に縦方向(行を追加)または横方向(列を追加)に連結します。
これらの関数を理解し使い分けることが、効率的なデータ前処理を行うための鍵となります。
キーに基づくデータ結合:pd.merge()
pd.merge()
関数は、二つのデータフレームに共通するキー列を指定してデータを結合するために使用されます。SQLのJOIN操作をご存知であれば、その概念とよく似ています。
merge
の基本的な使い方
最も基本的な使い方は、結合する二つのデータフレームと、結合のキーとなる列を指定することです。
import pandas as pd
# サンプルデータフレームの作成
df1 = pd.DataFrame({
'id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'David']
})
df2 = pd.DataFrame({
'id': [1, 3, 5, 6],
'city': ['Tokyo', 'Osaka', 'Nagoya', 'Fukuoka']
})
print("df1:")
print(df1)
print("\ndf2:")
print(df2)
# 'id'列をキーとして結合(デフォルトはinner結合)
merged_df = pd.merge(df1, df2, on='id')
print("\nMerged DataFrame (inner join on 'id'):")
print(merged_df)
上記の例では、df1
とdf2
を、共通する列である'id'
をキーとして結合しています。デフォルトではhow='inner'
となり、両方のデータフレームに存在するid
のみが結果に含まれます。
結合の種類(how
引数)
pd.merge()
のhow
引数を使うことで、SQLのJOINと同様に様々な種類の結合を指定できます。
'inner'
: 両方のデータフレームに存在するキーに対応する行のみを結合します(デフォルト)。'left'
: 左側のデータフレーム(mergeの第一引数)の全ての行を保持し、右側のデータフレームから一致する行を結合します。一致しない場合は、右側の列には欠損値(NaN)が入ります。'right'
: 右側のデータフレーム(mergeの第二引数)の全ての行を保持し、左側のデータフレームから一致する行を結合します。一致しない場合は、左側の列には欠損値(NaN)が入ります。'outer'
: 両方のデータフレームの全てのキーに対応する行を結合します。どちらかのデータフレームにしか存在しないキーの場合、対応する列には欠損値(NaN)が入ります。
# 'id'列をキーとして左結合
left_merged_df = pd.merge(df1, df2, on='id', how='left')
print("\nLeft Merged DataFrame:")
print(left_merged_df)
# 'id'列をキーとして右結合
right_merged_df = pd.merge(df1, df2, on='id', how='right')
print("\nRight Merged DataFrame:")
print(right_merged_df)
# 'id'列をキーとして外部結合
outer_merged_df = pd.merge(df1, df2, on='id', how='outer')
print("\nOuter Merged DataFrame:")
print(outer_merged_df)
異なるキー列名での結合
結合キーとなる列名が二つのデータフレームで異なる場合もあります。その際は、left_on
とright_on
引数を使用してそれぞれのデータフレームのキー列を指定します。
df3 = pd.DataFrame({
'user_id': [1, 3, 5, 6],
'purchase_amount': [1000, 5000, 3000, 2000]
})
print("\ndf3:")
print(df3)
# df1の'id'列とdf3の'user_id'列をキーとして結合
merged_df_diff_key = pd.merge(df1, df3, left_on='id', right_on='user_id', how='inner')
print("\nMerged DataFrame (different key names):")
print(merged_df_diff_key)
単純なデータ連結:pd.concat()
pd.concat()
関数は、複数のデータフレームを単純に縦方向(行を追加)または横方向(列を追加)に連結するために使用されます。これは、同じ構造を持つデータを結合する場合や、新しい列を追加する場合などに役立ちます。
concat
の基本的な使い方
連結したいデータフレームのリストを第一引数に渡し、連結方向をaxis
引数で指定します(0
が行方向、1
が列方向)。デフォルトはaxis=0
(行方向)です。
# サンプルデータフレームの作成
df_a = pd.DataFrame({
'col1': ['A0', 'A1'],
'col2': ['A2', 'A3']
})
df_b = pd.DataFrame({
'col1': ['B0', 'B1'],
'col2': ['B2', 'B3']
})
print("df_a:")
print(df_a)
print("\ndf_b:")
print(df_b)
# 行方向への連結
concatenated_rows = pd.concat([df_a, df_b], axis=0)
print("\nConcatenated DataFrame (axis=0, rows):")
print(concatenated_rows)
# 列方向への連結
concatenated_cols = pd.concat([df_a, df_b], axis=1)
print("\nConcatenated DataFrame (axis=1, columns):")
print(concatenated_cols)
行方向に連結する場合、元のデータフレームのインデックスがそのまま引き継がれることに注意してください。必要に応じて、ignore_index=True
を引数に加えることで、新しい連番のインデックスを振り直すことができます。
# 行方向への連結(インデックスを振り直し)
concatenated_rows_reset_index = pd.concat([df_a, df_b], axis=0, ignore_index=True)
print("\nConcatenated DataFrame (axis=0, ignore_index=True):")
print(concatenated_rows_reset_index)
merge
とconcat
の使い分け
merge
とconcat
はどちらもデータを結合する機能を持っていますが、その目的と使い方が異なります。
pd.merge()
: 二つのデータフレームを「共通のキー」に基づいて組み合わせたい場合に利用します。異なる情報源から得られた、関連性のあるデータを紐づける際に適しています。テーブル同士をリレーショナルに結合するイメージです。pd.concat()
: 複数のデータフレームを「単純に結合」したい場合に利用します。例えば、複数の月に分割された同じフォーマットの販売データを一つにまとめたい場合(行方向)、あるいは、同じ対象に関する異なる情報(例えば、基本情報と追加情報)を単純に横に並べたい場合(列方向)に適しています。データフレームを積み上げたり、横に並べたりするイメージです。
どちらを使うべきかは、結合したいデータの構造と、どのように組み合わせたいかによって判断します。
まとめと次のステップ
この記事では、データ分析の実践において不可欠なスキルであるデータ結合・連結について、Pandasのmerge
関数とconcat
関数を中心に解説しました。
pd.merge()
は共通のキーに基づいて二つのデータを結合し、リレーショナルな結合に適しています。how
引数で結合の種類を制御できます。pd.concat()
は複数のデータを単純に縦または横に連結し、構造が似ているデータをまとめるのに適しています。
これらの関数を使いこなせるようになれば、様々な形式で提供される実世界のデータを効率的に前処理し、分析可能な形に整えることができるようになります。
まずは、ご自身の身近にある、複数のファイルに分かれているデータを集めて、今回学んだmerge
やconcat
を試してみてください。例えば、CSVファイルとして保存された顧客リストと購入履歴、異なる期間の売上データなどを組み合わせてみるのも良いでしょう。
データ結合・連結はデータ前処理の重要な一歩です。このスキルを習得し、次の分析ステップへ進む準備を整えましょう。