【Pandas】DataFrame結合操作: concat, merge, joinを使いこなす

Pandas
この記事は約13分で読めます。

こんにちは、JS2IIUです。
今回は、複数のDataFrameを組み合わせて操作する上で欠かせないconcatmergejoinという3つのメソッドについて、具体的なサンプルコードを用いて解説します。

メソッド機能連結/結合キー結合の種類 (how)
concat複数のDataFrameを縦方向または横方向に連結する連結インデックス
merge2つのDataFrameを共通の列またはインデックスをキーとして結合する結合列またはインデックスinner (デフォルト), outer, left, right
join2つのDataFrameをインデックスをキーとして結合する(mergeのインデックス版)結合インデックスleft (デフォルト), inner, outer, right

1. concat: DataFrameを連結する

concatは、複数のDataFrameを縦方向または横方向に連結するためのメソッドです。axisオプションを適切に使って結合方向をコントロールします。axis=0:行方向、axis=1:列方向です

1.1 縦方向に連結 (デフォルト)

デフォルトでは、concatはDataFrameを縦方向に連結します。つまり、同じ列名を持つDataFrameを上下に積み重ねるようなイメージです。

サンプルコード

Python
import pandas as pd

# DataFrame df1
data1 = {'col1': ['A', 'B'], 'col2': [1, 2]}
df1 = pd.DataFrame(data1)

# DataFrame df2
data2 = {'col1': ['C', 'D'], 'col2': [3, 4]}
df2 = pd.DataFrame(data2)

# df1とdf2を縦方向に連結
df_concat_vertical = pd.concat([df1, df2])

print(df_concat_vertical)

コード解説

  1. import pandas as pd: Pandasライブラリをpdという名前でインポートします。
  2. data1, data2: 辞書型でDataFrameのデータを定義します。col1col2という列名を持つデータをそれぞれ用意しています。
  3. df1 = pd.DataFrame(data1), df2 = pd.DataFrame(data2): pd.DataFrame()を使って、辞書型のデータからDataFrame df1df2を作成します。
  4. df_concat_vertical = pd.concat([df1, df2]): pd.concat()を使って、df1df2をリストで渡し、縦方向に連結します。結果はdf_concat_verticalに格納されます。
  5. print(df_concat_vertical): 連結されたDataFrameを出力します。

出力

Plaintext
  col1  col2
0    A     1
1    B     2
0    C     3
1    D     4

行のインデックスが重複していることに注意してください。ignore_index=Trueオプションを使うと、インデックスを振り直すことができます。

Python
df_concat_vertical_reset_index = pd.concat([df1, df2], ignore_index=True)
print(df_concat_vertical_reset_index)

出力

Plaintext
  col1  col2
0    A     1
1    B     2
2    C     3
3    D     4

1.2 横方向に連結

axis=1を指定することで、DataFrameを横方向に連結できます。

サンプルコード

Python
import pandas as pd

# DataFrame df3
data3 = {'col1': ['A', 'B'], 'col2': [1, 2]}
df3 = pd.DataFrame(data3)

# DataFrame df4
data4 = {'col3': ['C', 'D'], 'col4': [3, 4]}
df4 = pd.DataFrame(data4)

# df3とdf4を横方向に連結
df_concat_horizontal = pd.concat([df3, df4], axis=1)

print(df_concat_horizontal)

コード解説

  1. data3, data4: 辞書型でDataFrameのデータを定義します。
  2. df3 = pd.DataFrame(data3), df4 = pd.DataFrame(data4): pd.DataFrame()を使って、辞書型のデータからDataFrame df3df4を作成します。
  3. df_concat_horizontal = pd.concat([df3, df4], axis=1): pd.concat()を使って、df3df4をリストで渡し、axis=1を指定して横方向に連結します。結果はdf_concat_horizontalに格納されます。
  4. print(df_concat_horizontal): 連結されたDataFrameを出力します。

出力

Plaintext
  col1  col2 col3  col4
0    A     1    C     3
1    B     2    D     4

2. merge: DataFrameを結合する (データベース風)

mergeは、SQLのようなデータベース風の結合操作を行うためのメソッドです。共通の列またはインデックスをキーとして、2つのDataFrameを結合します。デフォルトでは共通で含まれているキーのみ残しますが、howオプションで全てのキーを残すことも可能です。

サンプルコード

Python
import pandas as pd

# DataFrame df5
data5 = {'key': ['K0', 'K1', 'K2', 'K3'],
         'A': ['A0', 'A1', 'A2', 'A3'],
         'B': ['B0', 'B1', 'B2', 'B3']}
df5 = pd.DataFrame(data5)

# DataFrame df6
data6 = {'key': ['K0', 'K1', 'K2', 'K3'],
         'C': ['C0', 'C1', 'C2', 'C3'],
         'D': ['D0', 'D1', 'D2', 'D3']}
df6 = pd.DataFrame(data6)

# df5とdf6を'key'列をキーとして結合
df_merged = pd.merge(df5, df6, on='key')

print(df_merged)

コード解説

  1. data5, data6: 辞書型でDataFrameのデータを定義します。keyという共通の列名を持つデータをそれぞれ用意しています。
  2. df5 = pd.DataFrame(data5), df6 = pd.DataFrame(data6): pd.DataFrame()を使って、辞書型のデータからDataFrame df5df6を作成します。
  3. df_merged = pd.merge(df5, df6, on='key'): pd.merge()を使って、df5df6on='key'で指定したkey列をキーとして結合します。結果はdf_mergedに格納されます。
  4. print(df_merged): 結合されたDataFrameを出力します。

出力

Plaintext
  key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3  C3  D3

2.1 結合の種類 (howオプション)

howオプションを使うことで、結合の種類を指定できます。

  • inner: 内部結合。両方のDataFrameに存在するキーのみを残します (デフォルト)
  • outer: 外部結合。すべてのキーを残し、存在しないデータはNaNで埋められます
  • left: 左外部結合。左のDataFrameのキーをすべて残し、右のDataFrameに存在しないキーに対応するデータはNaNで埋められます。
  • right: 右外部結合。右のDataFrameのキーをすべて残し、左のDataFrameに存在しないキーに対応するデータはNaNで埋められます。

サンプルコード (外部結合)

Python
import pandas as pd

# DataFrame df7
data7 = {'key': ['K0', 'K1', 'K2', 'K3'],
         'A': ['A0', 'A1', 'A2', 'A3'],
         'B': ['B0', 'B1', 'B2', 'B3']}
df7 = pd.DataFrame(data7)

# DataFrame df8
data8 = {'key': ['K0', 'K1', 'K4', 'K5'],
         'C': ['C0', 'C1', 'C4', 'C5'],
         'D': ['D0', 'D1', 'D4', 'D5']}
df8 = pd.DataFrame(data8)

# df7とdf8を'key'列をキーとして外部結合
df_merged_outer = pd.merge(df7, df8, on='key', how='outer')

print(df_merged_outer)

コード解説

  1. data7, data8: 辞書型でDataFrameのデータを定義します。keyという共通の列名を持つデータをそれぞれ用意しています。df7にはK2, K3df8にはK4, K5というキーが含まれています。
  2. df7 = pd.DataFrame(data7), df8 = pd.DataFrame(data8): pd.DataFrame()を使って、辞書型のデータからDataFrame df7df8を作成します。
  3. df_merged_outer = pd.merge(df7, df8, on='key', how='outer'): pd.merge()を使って、df7df8on='key'で指定したkey列をキーとして、how='outer'で外部結合します。結果はdf_merged_outerに格納されます。
  4. print(df_merged_outer): 結合されたDataFrameを出力します。

出力

Plaintext
  key    A    B    C    D
0  K0   A0   B0   C0   D0
1  K1   A1   B1   C1   D1
2  K2   A2   B2  NaN  NaN
3  K3   A3   B3  NaN  NaN
4  K4  NaN  NaN   C4   D4
5  K5  NaN  NaN   C5   D5

3. join: DataFrameを結合する (インデックスベース)

joinは、インデックスをベースにDataFrameを結合するメソッドです。mergeと似ていますが、DataFrameのメソッドであることに注意して下さい。

サンプルコード

Python
import pandas as pd

# DataFrame left
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                    index=['K0', 'K1', 'K2'])

# DataFrame right
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                      'D': ['D0', 'D2', 'D3']},
                     index=['K0', 'K2', 'K3'])

# leftとrightをインデックスをキーとして結合
df_joined = left.join(right)

print(df_joined)

コード解説

  1. left, right: 辞書型でDataFrameのデータを定義します。index引数を使って、インデックスを指定しています。
  2. left = pd.DataFrame(...), right = pd.DataFrame(...): pd.DataFrame()を使って、辞書型のデータからDataFrame leftrightを作成します。
  3. df_joined = left.join(right): leftjoin()メソッドを使って、rightをインデックスをキーとして結合します。結果はdf_joinedに格納されます。
  4. print(df_joined): 結合されたDataFrameを出力します。

出力

Plaintext
     A   B    C    D
K0  A0  B0   C0   D0
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2

joinでもhowオプションを使って結合の種類を指定できます。デフォルトはhow='left'です。

まとめ表

メソッド機能連結/結合キー結合の種類 (how)
concat複数のDataFrameを縦方向または横方向に連結する連結インデックス
merge2つのDataFrameを共通の列またはインデックスをキーとして結合する結合列またはインデックスinner (デフォルト), outer, left, right
join2つのDataFrameをインデックスをキーとして結合する(mergeのインデックス版)結合インデックスleft (デフォルト), inner, outer, right

参考


Pythonに関する書籍の<PR>です。

24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。

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

コメント

タイトルとURLをコピーしました