Pythonデータ分析レシピ集

Python Pandasでデータフレームを結合・連結する:mergeとconcat活用レシピ

Tags: Python, Pandas, データ結合, データ連結, データ前処理

はじめに

データ分析を行う際、データは常に一つのファイルやテーブルにまとまっているとは限りません。異なるソースから得られたデータや、複数のカテゴリに分割されたデータなど、複数のデータセットを統合して分析を進める場面は頻繁に発生します。例えば、顧客情報が格納されたデータと購買履歴が格納されたデータ、あるいは月ごとの売上データが個別のファイルに分かれているケースなどが考えられます。

このような状況において、Pythonのデータ分析ライブラリであるPandasは、複数のデータフレームを結合したり連結したりするための強力な機能を提供します。この記事では、Pandasの主要な関数であるmergeconcatに焦点を当て、それぞれの機能と具体的な使用方法をコードレシピとしてご紹介いたします。この記事を読むことで、読者の皆様は複数のデータフレームを効果的に統合し、より複雑なデータ分析へと進むための基礎を習得できるでしょう。

問題提起:複数のデータフレームを統合する

データ分析の現場では、次のような課題に直面することがあります。

これらの課題を解決するためには、Pandasのデータフレームを適切に結合(Join)または連結(Concatenate)する操作が必要となります。mergeconcatは、それぞれの用途に応じて最適なデータ統合の方法を提供します。

解決策(コードレシピ):mergeconcatの活用

ここでは、merge関数とconcat関数を用いたデータフレームの結合・連結方法を、具体的なコード例とともにご紹介します。

1. 必要なライブラリのインポート

まず、Pandasライブラリをインポートします。

import pandas as pd

2. サンプルデータの準備

結合・連結の動作を確認するために、いくつかのサンプルデータフレームを作成します。

# --- merge関数用のサンプルデータ ---
# 顧客情報データフレーム
customers_df = pd.DataFrame({
    'customer_id': [1, 2, 3, 4],
    'name': ['田中', '佐藤', '鈴木', '高橋'],
    'age': [30, 24, 35, 29]
})

# 注文情報データフレーム
orders_df = pd.DataFrame({
    'order_id': [101, 102, 103, 104, 105],
    'customer_id': [1, 2, 1, 5, 3], # customer_id=5はcustomers_dfに存在しない
    'product': ['りんご', 'バナナ', 'みかん', 'ぶどう', 'いちご'],
    'price': [100, 150, 120, 200, 180]
})

print("--- 顧客情報データフレーム (customers_df) ---")
print(customers_df)
print("\n--- 注文情報データフレーム (orders_df) ---")
print(orders_df)

# --- concat関数用のサンプルデータ ---
# 2023年1月度の売上データ
sales_jan_df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'revenue': [1000, 1500, 800]
})

# 2023年2月度の売上データ
sales_feb_df = pd.DataFrame({
    'item': ['B', 'C', 'D'],
    'revenue': [1200, 900, 600]
})

# 2023年3月度の売上データ (列の順序が異なる場合を想定)
sales_mar_df = pd.DataFrame({
    'revenue': [2000, 700],
    'item': ['A', 'E']
})

# 地域別データ (列方向に連結する場合)
region_a_df = pd.DataFrame({
    'product': ['PC', 'Monitor'],
    'sales_region_A': [50000, 20000]
})

region_b_df = pd.DataFrame({
    'product': ['PC', 'Monitor'],
    'sales_region_B': [60000, 25000]
})

print("\n--- 1月売上データ (sales_jan_df) ---")
print(sales_jan_df)
print("\n--- 2月売上データ (sales_feb_df) ---")
print(sales_feb_df)
print("\n--- 3月売上データ (sales_mar_df) ---")
print(sales_mar_df)
print("\n--- 地域A売上データ (region_a_df) ---")
print(region_a_df)
print("\n--- 地域B売上データ (region_b_df) ---")
print(region_b_df)

3. pd.merge() を用いたデータフレームの結合

pd.merge()は、SQLのJOIN操作に似た方法で、共通のキー(列)に基づいて2つのデータフレームを結合します。

3.1. 内部結合(Inner Join)

両方のデータフレームに共通して存在するキーのみを結合します。

# 内部結合の実行
merged_inner_df = pd.merge(customers_df, orders_df, on='customer_id', how='inner')
print("\n--- 内部結合 (Inner Join) の結果 ---")
print(merged_inner_df)
3.2. 左外部結合(Left Join)

左側のデータフレームの全ての行を含み、右側のデータフレームからは共通のキーを持つ行を結合します。右側に一致するキーがない場合、その値はNaN(欠損値)となります。

# 左外部結合の実行
merged_left_df = pd.merge(customers_df, orders_df, on='customer_id', how='left')
print("\n--- 左外部結合 (Left Join) の結果 ---")
print(merged_left_df)
3.3. 右外部結合(Right Join)

右側のデータフレームの全ての行を含み、左側のデータフレームからは共通のキーを持つ行を結合します。左側に一致するキーがない場合、その値はNaNとなります。

# 右外部結合の実行
merged_right_df = pd.merge(customers_df, orders_df, on='customer_id', how='right')
print("\n--- 右外部結合 (Right Join) の結果 ---")
print(merged_right_df)
3.4. 完全外部結合(Outer Join)

両方のデータフレームの全ての行を含みます。一致しないキーの行は、対応する他方のデータフレームの列がNaNとなります。

# 完全外部結合の実行
merged_outer_df = pd.merge(customers_df, orders_df, on='customer_id', how='outer')
print("\n--- 完全外部結合 (Outer Join) の結果 ---")
print(merged_outer_df)

4. pd.concat() を用いたデータフレームの連結

pd.concat()は、複数のデータフレームを「縦方向(行方向)」または「横方向(列方向)」に単純に連結します。

4.1. 行方向への連結(デフォルト)

複数のデータフレームを上下に結合します。列名が異なる場合でも、可能な限り結合を試み、一致しない列はNaNで埋められます。

# 行方向への連結 (axis=0 がデフォルト)
concatenated_rows_df = pd.concat([sales_jan_df, sales_feb_df, sales_mar_df])
print("\n--- 行方向への連結 (concat) の結果 ---")
print(concatenated_rows_df)

# インデックスをリセットする場合
concatenated_rows_reset_index_df = pd.concat([sales_jan_df, sales_feb_df, sales_mar_df], ignore_index=True)
print("\n--- 行方向への連結 (concat, インデックスリセット) の結果 ---")
print(concatenated_rows_reset_index_df)
4.2. 列方向への連結

複数のデータフレームを左右に結合します。デフォルトではインデックスに基づいて結合されます。

# 列方向への連結 (axis=1)
concatenated_cols_df = pd.concat([region_a_df, region_b_df], axis=1)
print("\n--- 列方向への連結 (concat, product列が重複) の結果 ---")
print(concatenated_cols_df)

# product列を基準に結合したい場合は、mergeを使う方が適切です。
# 例: pd.merge(region_a_df, region_b_df, on='product', how='outer')

pd.concat()で列方向連結を行う場合、共通の列名が存在すると重複してしまいます。このようなケースで特定の列を基準に結合したい場合はpd.merge()を使用するのが一般的です。

コードの詳細解説

pd.merge() の解説

pd.merge(left, right, on=None, how='inner', ...) は、2つのデータフレーム(leftright)を結合するための関数です。

pd.concat() の解説

pd.concat(objs, axis=0, join='outer', ignore_index=False, ...) は、複数のデータフレームやSeriesを連結するための関数です。

mergeconcatの使い分けのポイント

よくあるエラーとその解決策

まとめ

この記事では、PythonのPandasライブラリを用いて複数のデータフレームを統合するための2つの主要な関数、pd.merge()pd.concat() について、それぞれの機能と具体的な使用方法を解説いたしました。

pd.merge() は、共通のキーを基にデータフレームを結合する際に非常に強力であり、SQLのJOIN操作と同様の柔軟な結合が可能です。一方、pd.concat() は、データフレームを単純に上下または左右に連結する際に役立ちます。

これらの機能を使いこなすことで、異なるデータソースからの情報を効率的に統合し、より高度なデータ分析へとスムーズに移行することができるようになります。本レシピが、読者の皆様のデータ分析作業の一助となれば幸いです。