サイトアイコン アマチュア無線局JS2IIU

【Pandas】DataFrame同士を結合する方法: 列方向と行方向の結合をマスターしよう!

データ分析でよく使われるPandasのDataFrame。複数のDataFrameを結合して、より大きなデータセットを作りたい場面は多々あります。今回は、PandasでDataFrame同士を結合する、特に列方向行方向の結合に焦点を当てて、具体的な例を示しながら解説します。

列方向:

Python
df = pd.concat([df1, df2], axis=1)

行方向:

Python
df = pd.concat([df1, df2])

はじめに: 結合の種類

Pandasでは、主に以下の方法でDataFrameを結合できます。

  1. concat(): 複数のDataFrameを列方向または行方向に単純に連結する。
  2. merge(): SQLのJOIN操作のように、共通のキー列に基づいてDataFrameを結合する。
  3. join(): インデックスをキーとしてDataFrameを結合する。

この記事では、最も基本的なconcat()関数を用いた、列方向と行方向の結合に絞って説明します。merge()join()については、別の機会に詳しく解説します。

1. 列方向に結合する (横に結合)

列方向の結合とは、複数のDataFrameを横に並べるように結合することです。concat()関数のaxis引数に1を指定することで実現できます。

例1: 同じインデックスを持つDataFrameを列方向に結合

まずは、同じインデックスを持つ2つのDataFrameを列方向に結合してみましょう。

Python
import pandas as pd

# DataFrame df1を作成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                    'B': ['B0', 'B1', 'B2']},
                   index=['I0', 'I1', 'I2'])

print("df1:\n", df1)

# DataFrame df2を作成
df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
                    'D': ['D0', 'D1', 'D2']},
                   index=['I0', 'I1', 'I2'])

print("\ndf2:\n", df2)

# df1とdf2を列方向に結合
result = pd.concat([df1, df2], axis=1)

print("\nresult:\n", result)

説明:

  1. DataFrameの作成: df1df2という2つのDataFrameを作成します。両者とも同じインデックス ('I0', 'I1', 'I2') を持っています。
  2. pd.concat([df1, df2], axis=1): concat()関数を使ってdf1df2を結合します。axis=1を指定することで列方向に結合されます。
  3. 結果: resultには、df1の右側にdf2が結合されたDataFrameが格納されます。

出力:

Plaintext
df1:
      A   B
I0  A0  B0
I1  A1  B1
I2  A2  B2

df2:
      C   D
I0  C0  D0
I1  C1  D1
I2  C2  D2

result:
      A   B   C   D
I0  A0  B0  C0  D0
I1  A1  B1  C1  D1
I2  A2  B2  C2  D2

例2: 異なるインデックスを持つDataFrameを列方向に結合

次に、異なるインデックスを持つDataFrameを結合してみましょう。

Python
import pandas as pd

# DataFrame df3を作成
df3 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                    'B': ['B0', 'B1', 'B2']},
                   index=['I0', 'I1', 'I2'])

print("df3:\n", df3)

# DataFrame df4を作成
df4 = pd.DataFrame({'C': ['C1', 'C2', 'C3'],
                    'D': ['D1', 'D2', 'D3']},
                   index=['I1', 'I2', 'I3'])

print("\ndf4:\n", df4)

# df3とdf4を列方向に結合
result = pd.concat([df3, df4], axis=1)

print("\nresult:\n", result)

説明:

  1. DataFrameの作成: df3df4という2つのDataFrameを作成します。df3'I0', 'I1', 'I2'df4'I1', 'I2', 'I3'というインデックスを持ち、部分的に重複しています。
  2. pd.concat([df3, df4], axis=1): df3df4を列方向に結合します。
  3. 結果: resultでは、結合されたDataFrameは、存在しないデータに対応する要素にNaN (Not a Number) が入っています。df3はインデックスI3の行が欠落しているのでその部分がNaNになり、df4はインデックスI0の行が欠落しているのでその部分がNaNになります。

出力:

Plaintext
df3:
      A   B
I0  A0  B0
I1  A1  B1
I2  A2  B2

df4:
      C   D
I1  C1  D1
I2  C2  D2
I3  C3  D3

result:
      A    B    C    D
I0   A0   B0  NaN  NaN
I1   A1   B1   C1   D1
I2   A2   B2   C2   D2
I3  NaN  NaN   C3   D3

2. 行方向に結合する (縦に結合)

行方向の結合とは、複数のDataFrameを縦に積み重ねるように結合することです。concat()関数のaxis引数に0を指定することで実現できます(デフォルトはaxis=0)。

例3: 同じ列を持つDataFrameを行方向に結合

まずは、同じ列を持つ2つのDataFrameを行方向に結合してみましょう。

Python
import pandas as pd

# DataFrame df5を作成
df5 = pd.DataFrame({'A': ['A0', 'A1'],
                    'B': ['B0', 'B1']},
                   index=['I0', 'I1'])

print("df5:\n", df5)

# DataFrame df6を作成
df6 = pd.DataFrame({'A': ['A2', 'A3'],
                    'B': ['B2', 'B3']},
                   index=['I2', 'I3'])

print("\ndf6:\n", df6)

# df5とdf6を行方向に結合
result = pd.concat([df5, df6]) # axis=0は省略可能

print("\nresult:\n", result)

説明:

  1. DataFrameの作成: df5df6という2つのDataFrameを作成します。両者とも同じ列 ('A', 'B') を持っています。
  2. pd.concat([df5, df6]): df5df6を行方向に結合します。axis=0はデフォルトなので省略可能です。
  3. 結果: resultには、df5の下にdf6が結合されたDataFrameが格納されます。インデックスは元のDataFrameのものが保持されます。

出力:

Plaintext
df5:
      A   B
I0  A0  B0
I1  A1  B1

df6:
      A   B
I2  A2  B2
I3  A3  B3

result:
      A   B
I0  A0  B0
I1  A1  B1
I2  A2  B2
I3  A3  B3

例4: 異なる列を持つDataFrameを行方向に結合

次に、異なる列を持つDataFrameを結合してみましょう。

Python
import pandas as pd

# DataFrame df7を作成
df7 = pd.DataFrame({'A': ['A0', 'A1'],
                    'B': ['B0', 'B1']},
                   index=['I0', 'I1'])

print("df7:\n", df7)

# DataFrame df8を作成
df8 = pd.DataFrame({'B': ['B2', 'B3'],
                    'C': ['C2', 'C3']},
                   index=['I2', 'I3'])

print("\ndf8:\n", df8)

# df7とdf8を行方向に結合
result = pd.concat([df7, df8])

print("\nresult:\n", result)

説明:

  1. DataFrameの作成: df7df8という2つのDataFrameを作成します。df7'A', 'B'df8'B', 'C'という列を持ち、'B'列が共通しています。
  2. pd.concat([df7, df8]): df7df8を行方向に結合します。
  3. 結果: resultでは、結合されたDataFrameは、存在しないデータに対応する要素にNaNが入ります。そして、共通する列Bのデータは、同じ列に収まっています。

出力:

Plaintext
df7:
      A   B
I0  A0  B0
I1  A1  B1

df8:
      B   C
I2  B2  C2
I3  B3  C3

result:
      A   B    C
I0   A0  B0  NaN
I1   A1  B1  NaN
I2  NaN  B2   C2
I3  NaN  B3   C3

まとめ

Pandasのconcat()関数を使ってDataFrameを列方向と行方向に結合する方法を解説しました。

これらの基本的な結合方法を理解しておけば、データ分析の様々な場面で役立ちます。

参考になるWEBサイト

これらのサイトでは、concat()だけでなく、merge()join()による結合方法など、さらに詳しい情報が提供されていますので、ぜひ参考にしてください。

今回も少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。

「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございます。73

モバイルバージョンを終了