pythonを勉強する中で、理解に時間がかかったので、この記事にまとめることで、自身の備忘録と同じ悩みを持つ誰かの参考になれば幸いです。
この記事で分かること
・merge,join,concat,appendの微妙な使い分けがわかる
はじめに、下記表にまとめます。
関数 | 説明 | 主な使い方 |
merge | 2つのデータフレームを特定のカラムをキーとして結合します。 | pd.merge(df1, df2, on=’key’, how=’inner’) |
join | 2つのデータフレームをインデックスをキーとして結合します(または、任意のカラムをキーとすることも可能) | 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の下位互換。将来的に削除される機能のため、無視して良い
以上、参考になれば幸いです。