Skip to content

Pandasの2つのDataFrameを結合する方法を紹介!

Updated on

Pandasは、データサイエンスにおいて最も人気のあるオープンソースツールの1つです。DataFrame構造を提供しており、表形式のデータ操作、クリーニング、分析、および可視化に高レベルな性能を提供しています。Pandasでは、2つ以上のDataFramesをマージして、データの分析を行うことが一般的です。データフレームを垂直または水平に組み合わせることによってこれを実現できます。ここでは、両方の方法について詳しく説明します。

Python Pandas Dataframeからコードなしですばやくデータ可視化を作成したいですか?

PyGWalkerは、可視化付きの探索的データ分析のためのPythonライブラリです。 PyGWalker (opens in a new tab)は、pandas dataframe(およびpolars dataframe)をTableauスタイルのユーザーインターフェイスに変換して、ビジュアル探索のためのワークフローを簡素化できます。

PyGWalker for Data visualization (opens in a new tab)

垂直に2つのDataFramesを連結する

Pandasでは、 concat()メソッドを使用して2つのDataFramesを連結できます。これを説明するために、まず2つのサンプルDataFramesを作成します。最初のサンプルDataFrameでは、会社のいくつかの従業員に関する情報があると仮定しましょう。

import pandas as pd
 
# DataFrame 1を作成する
df1 = pd.DataFrame({
    'Name': ['John', 'Jack', 'Steve', 'Sarah'],
    'Age': [24, 32, 19, 29],
    'Gender': ['M', 'M', 'M', 'F']
})

これにより、以下のようなDataFrameが作成されます。

    Name    Age Gender
0   John    24     M
1   Jack    32     M
2   Steve   19     M
3   Sarah   29     F

会社の部署に関する情報が含まれる別のDataFrameがあると仮定しましょう。

# DataFrame 2を作成する
df2 = pd.DataFrame({
    'Department': ['Marketing', 'Sales', 'Human Resources'],
    'Employees': [15, 12, 10],
})

これにより、以下のようなDataFrameが作成されます。

        Department    Employees
0       Marketing        15
1           Sales        12
2   Human Resources     10

これで、concat()メソッドを使用して2つのDataFramesを垂直に組み合わせることができます。

# 垂直に連結する
df3 = pd.concat([df1, df2], axis=0)

ここで、 axis = 0パラメーターは、DataFramesを上下に積み重ねて(つまり、垂直方向に)連結することを示します。連結後、以下の出力が得られます。

        Name    Age Gender   Department    Employees
0       John    24      M     NaN          NaN
1       Jack    32      M     NaN          NaN
2      Steve    19      M     NaN          NaN
3      Sarah    29      F     NaN          NaN
0       NaN     NaN    NaN    Marketing     15
1       NaN     NaN    NaN    Sales         12
2       NaN     NaN    NaN    Human Resources 10

2つのDataFramesが望ましいように連結されていることがわかりますが、列名が一致しない場合には新しいDataFrameのいくつかのNaN(null)値があります。これらの行は、データ分析に適合しない場合は削除することができ、null値を埋めるためのデフォルト値を与えることができます。

水平に2つのDataFramesを連結する

concat()メソッドを使用して、2つのDataFramesを水平に連結することもできます(つまり、側面に置いて結合することができます)。

# 水平に連結する
df4 = pd.concat([df1, df2], axis=1)

ここで、axis = 1パラメーターは、DataFramesを並べて(つまり、水平方向に)連結することを示します。連結後、以下の出力が得られます。以下のmdxとフロントマターを日本語に翻訳する:

Pandasデータフレームの連結

Pandasは、複数のデータフレームを連結して1つにする機能を提供しています。そのためにconcat()というメソッドが用意されています。この記事では、concat()メソッドを使ったデータフレームの連結方法について簡単に紹介します。

データフレームの連結

Pandasのconcat()メソッドを使うと、複数のデータフレームを連結して、新しいデータフレームを作成することができます。concat()メソッドには、axisjoinignore_indexkeysなどのパラメーターがあります。以下でそれぞれのパラメーターを説明します。

  • axis: 連結する方向を指定します。0は縦方向、1は横方向を表します。
  • join: 連結方法を指定します。デフォルトは「outer」です。他には「inner」や「left」、「right」があります。
  • ignore_index: インデックスを無視して新しいインデックスを振り直すかどうかを設定します。
  • keys: 連結前のデータフレームを区別するために、新しい階層型のインデックスを作成します。

以下では実際に、concat()メソッドを使ったデータフレームの連結方法について説明します。

縦方向にデータフレームを連結する

concat()メソッドを使って複数のデータフレームを縦方向に連結する方法を見ていきます。

# 3つのデータフレームを作成する
df1 = pd.DataFrame({
    "Name": ["John", "Jack", "Steve", "Sarah"],
    "Age": [24, 32, 19, 29],
    "Gender": ["M", "M", "M", "F"]
})
df2 = pd.DataFrame({
    "Name": ["Peter", "Johnny", "Becky"],
    "Age": [27, 23, 21],
    "Gender": ["M", "M", "F"]
})
df3 = pd.DataFrame({
    "Name": ["Mary", "Jane"],
    "Age": [28, 22],
    "Gender": ["F"]
})

pd.concat()メソッドを使って、これらのデータフレームを連結することができます。

# データフレームを縦方向に連結する
df_concat = pd.concat([df1, df2, df3], axis=0)

これによって、3つのデータフレームが縦方向に連結されました。

     Name  Age Gender
0    John   24      M
1    Jack   32      M
2   Steve   19      M
3   Sarah   29      F
0   Peter   27      M
1  Johnny   23      M
2   Becky   21      F
0    Mary   28      F
1    Jane   22      F

pd.concat()メソッドのaxisパラメーターを0に設定することで、データフレームを縦方向に連結することができることがわかります。

横方向にデータフレームを連結する

次は、複数のデータフレームを横方向に連結する方法を見ていきます。

# 2つのデータフレームを作成する
df4 = pd.DataFrame({
    "Department": ["Marketing", "Sales", "Human Resources"],
    "Employees": [15, 12, 10]
})
df5 = pd.DataFrame({
    "Employee Name": ["John", "Jack", "Steve", "Sarah"],
    "Employee Age": [24, 32, 19, 29],
    "Job Title": ["Manager", "Assistant", "Clerk", "Executive"]
})

これらのデータフレームを横方向に連結するには、axisパラメーターを1に設定します。

# データフレームを横方向に連結する
df_concat = pd.concat([df4, df5], axis=1)

連結結果は以下の通りです。

      Department   Employees  Employee Name  Employee Age    Job Title
0       Marketing         15           John            24      Manager
1           Sales         12           Jack            32   Assistant
2  Human Resources         10          Steve            19       Clerk
3              NaN        NaN          Sarah            29   Executive

希望通り、2つのデータフレームが横方向に連結されています。ただし、行名が一致しない場所にはNaN(null)の値があります。これらの行は、データ分析に合わない場合は削除することができますが、null値を埋めるデフォルト値を指定することもできます。

列数が異なるデータフレームの連結

2つの連結するデータフレームの列数が異なる場合、Pandasは一致しない列名を特定して、新しいデータフレームに別の列として追加します。これを次の例で説明します。

# 列数が異なるデータフレームを作成する
df5 = pd.DataFrame({
    'Employee Name': ['John', 'Jack', 'Steve', 'Sarah'],
    'Employee Age': [24, 32, 19, 29],
    'Job Title': ['Manager', 'Assistant', 'Clerk', 'Executive']
})

次に、df1df5を連結します。

# df1とdf5を連結する
df6 = pd.concat([df1, df5], axis=1)

連結後に、次の出力が得られます。

     Name  Age Gender Employee Name  Employee Age    Job Title
0    John   24      M         John            24      Manager
1    Jack   32      M         Jack            32   Assistant
2   Steve   19      M        Steve            19       Clerk
3   Sarah   29      F        Sarah            29   Executive

Pandasは、一致しない列を新しい列として新しいデータフレームに追加しています。

インデックスを無視して横方向にデータフレームを連結する

2つのデータフレームを横方向に連結する場合、新しいデータフレームには元のデータフレームのインデックスが保持されます。これは、この新しいデータフレームを操作するときに問題が生じる可能性があるため、一定の注意が必要です。この場合、横方向に連結する場合はインデックスを無視することをお勧めします。これは、連結するときにignore_indexパラメーターをTrueに設定することで実現できます。

# df1とdf2を連結し、インデックスを無視する
df7 = pd.concat([df1, df2], axis=1, ignore_index=True)

連結後に、次の出力が得られます。

``