こんにちは、JS2IIUです。
今回は、複数のDataFrameを組み合わせて操作する上で欠かせないconcat、merge、joinという3つのメソッドについて、具体的なサンプルコードを用いて解説します。
| メソッド | 機能 | 連結/結合 | キー | 結合の種類 (how) |
|---|---|---|---|---|
concat | 複数のDataFrameを縦方向または横方向に連結する | 連結 | インデックス | – |
merge | 2つのDataFrameを共通の列またはインデックスをキーとして結合する | 結合 | 列またはインデックス | inner (デフォルト), outer, left, right |
join | 2つのDataFrameをインデックスをキーとして結合する(mergeのインデックス版) | 結合 | インデックス | left (デフォルト), inner, outer, right |
1. concat: DataFrameを連結する
concatは、複数のDataFrameを縦方向または横方向に連結するためのメソッドです。axisオプションを適切に使って結合方向をコントロールします。axis=0:行方向、axis=1:列方向です。
1.1 縦方向に連結 (デフォルト)
デフォルトでは、concatはDataFrameを縦方向に連結します。つまり、同じ列名を持つDataFrameを上下に積み重ねるようなイメージです。

サンプルコード
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)コード解説
import pandas as pd: Pandasライブラリをpdという名前でインポートします。data1,data2: 辞書型でDataFrameのデータを定義します。col1とcol2という列名を持つデータをそれぞれ用意しています。df1 = pd.DataFrame(data1),df2 = pd.DataFrame(data2):pd.DataFrame()を使って、辞書型のデータからDataFramedf1とdf2を作成します。df_concat_vertical = pd.concat([df1, df2]):pd.concat()を使って、df1とdf2をリストで渡し、縦方向に連結します。結果はdf_concat_verticalに格納されます。print(df_concat_vertical): 連結されたDataFrameを出力します。
出力
col1 col2
0 A 1
1 B 2
0 C 3
1 D 4行のインデックスが重複していることに注意してください。ignore_index=Trueオプションを使うと、インデックスを振り直すことができます。
df_concat_vertical_reset_index = pd.concat([df1, df2], ignore_index=True)
print(df_concat_vertical_reset_index)出力
col1 col2
0 A 1
1 B 2
2 C 3
3 D 41.2 横方向に連結
axis=1を指定することで、DataFrameを横方向に連結できます。

サンプルコード
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)コード解説
data3,data4: 辞書型でDataFrameのデータを定義します。df3 = pd.DataFrame(data3),df4 = pd.DataFrame(data4):pd.DataFrame()を使って、辞書型のデータからDataFramedf3とdf4を作成します。df_concat_horizontal = pd.concat([df3, df4], axis=1):pd.concat()を使って、df3とdf4をリストで渡し、axis=1を指定して横方向に連結します。結果はdf_concat_horizontalに格納されます。print(df_concat_horizontal): 連結されたDataFrameを出力します。
出力
col1 col2 col3 col4
0 A 1 C 3
1 B 2 D 42. merge: DataFrameを結合する (データベース風)
mergeは、SQLのようなデータベース風の結合操作を行うためのメソッドです。共通の列またはインデックスをキーとして、2つのDataFrameを結合します。デフォルトでは共通で含まれているキーのみ残しますが、howオプションで全てのキーを残すことも可能です。

サンプルコード
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)コード解説
data5,data6: 辞書型でDataFrameのデータを定義します。keyという共通の列名を持つデータをそれぞれ用意しています。df5 = pd.DataFrame(data5),df6 = pd.DataFrame(data6):pd.DataFrame()を使って、辞書型のデータからDataFramedf5とdf6を作成します。df_merged = pd.merge(df5, df6, on='key'):pd.merge()を使って、df5とdf6をon='key'で指定したkey列をキーとして結合します。結果はdf_mergedに格納されます。print(df_merged): 結合されたDataFrameを出力します。
出力
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 D32.1 結合の種類 (howオプション)
howオプションを使うことで、結合の種類を指定できます。
inner: 内部結合。両方のDataFrameに存在するキーのみを残します (デフォルト)。outer: 外部結合。すべてのキーを残し、存在しないデータはNaNで埋められます。left: 左外部結合。左のDataFrameのキーをすべて残し、右のDataFrameに存在しないキーに対応するデータはNaNで埋められます。right: 右外部結合。右のDataFrameのキーをすべて残し、左のDataFrameに存在しないキーに対応するデータはNaNで埋められます。
サンプルコード (外部結合)
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)コード解説
data7,data8: 辞書型でDataFrameのデータを定義します。keyという共通の列名を持つデータをそれぞれ用意しています。df7にはK2,K3、df8にはK4,K5というキーが含まれています。df7 = pd.DataFrame(data7),df8 = pd.DataFrame(data8):pd.DataFrame()を使って、辞書型のデータからDataFramedf7とdf8を作成します。df_merged_outer = pd.merge(df7, df8, on='key', how='outer'):pd.merge()を使って、df7とdf8をon='key'で指定したkey列をキーとして、how='outer'で外部結合します。結果はdf_merged_outerに格納されます。print(df_merged_outer): 結合されたDataFrameを出力します。
出力
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 D53. join: DataFrameを結合する (インデックスベース)
joinは、インデックスをベースにDataFrameを結合するメソッドです。mergeと似ていますが、DataFrameのメソッドであることに注意して下さい。

サンプルコード
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)コード解説
left,right: 辞書型でDataFrameのデータを定義します。index引数を使って、インデックスを指定しています。left = pd.DataFrame(...),right = pd.DataFrame(...):pd.DataFrame()を使って、辞書型のデータからDataFrameleftとrightを作成します。df_joined = left.join(right):leftのjoin()メソッドを使って、rightをインデックスをキーとして結合します。結果はdf_joinedに格納されます。print(df_joined): 結合されたDataFrameを出力します。
出力
A B C D
K0 A0 B0 C0 D0
K1 A1 B1 NaN NaN
K2 A2 B2 C2 D2joinでもhowオプションを使って結合の種類を指定できます。デフォルトはhow='left'です。
まとめ表
| メソッド | 機能 | 連結/結合 | キー | 結合の種類 (how) |
|---|---|---|---|---|
concat | 複数のDataFrameを縦方向または横方向に連結する | 連結 | インデックス | – |
merge | 2つのDataFrameを共通の列またはインデックスをキーとして結合する | 結合 | 列またはインデックス | inner (デフォルト), outer, left, right |
join | 2つのDataFrameをインデックスをキーとして結合する(mergeのインデックス版) | 結合 | インデックス | left (デフォルト), inner, outer, right |
参考
- Merge, join, concatenate and compare — pandas 2.2.3 documentation
- pandas.concat — pandas 2.2.3 documentation
- pandas.merge — pandas 2.2.3 documentation
- pandas.DataFrame.join — pandas 2.2.3 documentation
Pythonに関する書籍の<PR>です。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。
最後まで読んでいただきありがとうございます。73


コメント