​【python】merge, join, concat,appendの使い分け・違いについてまとめる【pandas】

​【python】merge, join, concat,appendの使い分け・違いについてまとめる【pandas】

2023年10月11日

pythonを勉強する中で、理解に時間がかかったので、この記事にまとめることで、自身の備忘録と同じ悩みを持つ誰かの参考になれば幸いです。

この記事で分かること

・merge,join,concat,appendの微妙な使い分けがわかる

はじめに、下記表にまとめます。

関数説明主な使い方
merge2つのデータフレームを特定のカラムをキーとして結合します。pd.merge(df1, df2, on=’key’, how=’inner’)
join2つのデータフレームをインデックスをキーとして結合します(または、任意のカラムをキーとすることも可能)df1.join(df2, on=’key’, how=’left’)
concat複数のデータフレームやシリーズを指定した軸に沿って結合します。pd.concat([df1, df2], axis=0) (axis=0 で縦に結合、axis=1 で横に結合)
appendデータフレームの結合を行うメソッド。concat の簡易版と考えることができます。df1.append(df2)

なんとなくわかった気がします。どれも似たような使い方は可能ですが、それぞれ得意不得意がある模様。実際に使い方を見てみましょう。

まずはサンプルデータを作成する

import pandas as pd

# サンプルデータの作成
df1 = pd.DataFrame({
    'key': ['A', 'B', 'C', 'D'],
    'value1': [1, 2, 3, 4]
})

df2 = pd.DataFrame({
    'key': ['C', 'D', 'E', 'F'],
    'value2': [5, 6, 7, 8]
})
print(df1)
print(df2)
	key	value1
0	A	1
1	B	2
2	C	3
3	D	4

	key	value2
0	C	5
1	D	6
2	E	7
3	F	8

merge

# 'key' カラムを基に内部結合
merged = pd.merge(df1, df2, on='key', how='inner')
print(merged)
 key  value1  value2
0   C       3       5
1   D       4       6

2つのデータフレームで、共通のカラムがある場合に有効と思われます。

join

# 'key'カラムをインデックスへ
df1_indexed = df1.set_index('key')
df2_indexed = df2.set_index('key')

#インデックスを基に左結合
joined = df1_indexed.join(df2_indexed, how='left')
print(joined)
   value1  value2
key                
A         1     NaN
B         2     NaN
C         3     5.0
D         4     6.0

共通のインデックスがある場合に有効。

concat

concatenated_vertical = pd.concat([df1, df2], axis=0, ignore_index=True)
print(concatenated_vertical)
 key  value1  value2
0   A     1.0     NaN
1   B     2.0     NaN
2   C     3.0     NaN
3   D     4.0     NaN
4   C     NaN     5.0
5   D     NaN     6.0
6   E     NaN     7.0
7   F     NaN     8.0

単純に縦方向に結合するようです。カラムが別々に作られるため、ないデータはNaNで埋められます。

append

appended = df1.append(df2, ignore_index=True)
print(appended)
key  value1  value2
0   A     1.0     NaN
1   B     2.0     NaN
2   C     3.0     NaN
3   D     4.0     NaN
4   C     NaN     5.0
5   D     NaN     6.0
6   E     NaN     7.0
7   F     NaN     8.0
<ipython-input-28-cf45e42caac9>:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  appended = df1.append(df2, ignore_index=True)

concatと全く同じ出力となりましたが、気になるメッセージが出現しました。要約すると、将来的にappend関数は除去されるため、concat関数を使ってください ということでした。なるほど、concatの下位互換であり、機能は削除される予定のため、基本的にconcatを使用する方が良さそうです。

使い分けまとめ

一つ一つ見ていくと、以下のように使い分けるのが良さそうです。

  • merge:共通のカラムをキーとして結合したい場合に使う
  • join:共通のインデックスをキーとして結合したい場合に使う(例:時系列データなど)
  • concat:シンプルに縦方向、横方向に結合したい場合に使う
  • append:concatの下位互換。将来的に削除される機能のため、無視して良い

以上、参考になれば幸いです。