【Python】pandasで同じ列名を持つデータをスムーズに結合する方法

はじめに

pandasは、Pythonのデータ解析ライブラリの一つであり、数表形式のデータを扱うための高速で柔軟なツールです。pandasを使うことで、データの結合や加工、グループ化、集計、可視化などの処理が容易になります。

本記事では、pandasを使った同じ列名を持つデータの結合方法について解説します。

pandasの基本的な使い方

pandasを使用するには、まずpandasライブラリをインストールする必要があります。インストール方法は、以下のコマンドを実行するだけです。

!pip install pandas

pandasをインストールしたら、以下のようにpandasをインポートして使用します。

import pandas as pd

pandasでは、2つの主要なデータ構造を扱います。

  • シリーズ(Series):1次元の配列
    • データフレーム(DataFrame):2次元のテーブル形式のデータ

    データフレームは、行と列からなる2次元のテーブルで、列ごとに異なるデータ型を持つことができます。pandasでは、CSV、Excel、SQLなどの様々な形式のデータを読み込んでデータフレームとして扱うことができます。

    データフレームの結合方法の概要

    データフレームの結合には、以下のような方法があります。

    • 行方向に結合する(concatenate):pandas.concat()
      • 列方向に結合する(merge):pandas.merge()

      行方向の結合は、単純にデータフレームを縦に結合するだけであり、列の情報は変わりません。一方、列方向の結合は、共通の列をキーにして、2つのデータフレームを横に結合します。

      ここでは、列方向の結合に焦点を当てて解説します。

      同じ列名を持つデータフレームの結合方法

      データフレームを結合する際に、同じ列名を持つデータフレームを結合すると、列名が重複してしまいます。このような場合、pandasでは、列名に接尾辞を付加することで、重複を回避することができます。

      たとえば、以下のような2つのデータフレームdf1とdf2を考えます。それぞれに”Name”、”Age”、”Sex”という列名があります。

      import pandas as pd
      
      data1 = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'Sex': ['F', 'M', 'M']}
      data2 = {'Name': ['Alice', 'Dave', 'Eve', 'Frank'], 'Age': [25, 40, 45, 50], 'Sex': ['F', 'M', 'F', 'M']}
      df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2)

      この場合、列方向に結合するためには、pandas.merge()関数を使用します。pandas.merge()関数では、結合する2つのデータフレームと、結合するキーとなる列名を指定します。デフォルトでは、両方のデータフレームに共通する列をキーとして使用します。

      merged_df = pd.merge(df1, df2, on='Name')
      print(merged_df)

      上記のコードを実行すると、以下のような結果が得られます。

          Name  Age_x Sex_x  Age_y Sex_y
      0  Alice     25    F     25    F
      

      結果を見ると、同じ列名”Name”、”Age”、”Sex”が重複していることがわかります。この場合、”_x”、”_y”のような接尾辞が自動的に付加されています。

      列名が重複した場合の処理方法

      接尾辞を付加する際のデフォルトの接尾辞は、”_x”、”_y”ですが、pandas.merge()関数の引数suffixesを使用することで、接尾辞を指定することができます。

      merged_df = pd.merge(df1, df2, on='Name', suffixes=('_left', '_right'))
      print(merged_df)

      上記のコードを実行すると、以下のような結果が得られます。

         Name Age_left Sex_left Age_right Sex_right
      0 Alice       25        F        25         F
      

      ここでは、”_left”と”_right”という接尾辞を指定しています。

      また、同じ列名を持つデータフレームを結合する場合、列名に重複がある場合には、結合後のデータフレームから不要な列を削除する必要があります。削除する方法には、以下のような方法があります。

      • 不要な列を削除する(drop):DataFrame.drop()
        • 必要な列だけを選択する(reindex):DataFrame.reindex()

        たとえば、上記の結合後のデータフレームから、”Age_left”と”Sex_right”の2つの列を削除する場合、以下のようにDataFrame.drop()関数を使用します。

        merged_df = merged_df.drop(['Age_left', 'Sex_right'], axis=1)
        print(merged_df)

        上記のコードを実行すると、以下のような結果が得られます。

            Name Sex_left  Age_right
        0  Alice        F         25
        

        列名に重複がある場合には、結合後に不要な列を削除することで、データを整理することができます。

        実践例:具体的なデータを使った同じ列名の結合手順

        最後に、具体的なデータを使って、同じ列名を持つデータの結合手順を解説します。以下の例では、2つのcsvファイル”sales2019.csv”、”sales2020.csv”を読み込んで、年度ごとの売上データを結合します。

        まず、3つのcsvファイルを読み込みます。

        df2019 = pd.read_csv('sales2019.csv')
        df2020 = pd.read_csv('sales2020.csv')

        次に、3つのデータフレームを結合します。結合するキーは、”Product”と”Country”です。

        merged_df = pd.merge(df2019, df2020, on=['Product', 'Country'], suffixes=('_2019', '_2020'))

        上記のコードを実行すると、以下のような結果が得られます。

          Product   Country  Sales_2019  Sales_2020
        0 Product A      US         100         200
        1 Product A  Canada         150         250
        2 Product B      US         200         300
        3 Product B  Canada         250         350
        

        上記の結果を見ると、3つのcsvファイルから取得した年度ごとの売上データが結合され、1つのデータフレームにまとめられていることがわかります。

        まとめ

        本記事では、pandasを使って、同じ列名を持つデータを結合する方法について解説しました。具体的には、pandas.merge()関数を使用することで、2つ以上のデータフレームをキーによって結合することができます。また、同じ列名が重複する場合には、接尾辞を指定して列名を区別し、結合後に不要な列を削除することができます。

        pandasを使うことで、データの結合や加工、グループ化、集計、可視化などの処理が容易になります。データ解析においては、pandasは欠かせないツールの一つであるため、ぜひ使い方を覚えておきましょう。