はじめに
データの操作は、データサイエンティストやアナリストにとって重要なスキルであり、さまざまなデータ操作タスクを簡素化する柔軟なツールであるPandasライブラリがPythonで広く使用されています。この記事では、Pandasにおけるデータフレームを結合するための3つの基本的なテクニックであるマージ、連結、結合について解説します。
データフレームのマージ
マージは、列の値に基づいて2つのデータフレームを結合するための技術です。Pandasのマージ関数を使用することで、inner、outer、left、rightなどの異なる種類の結合を実行できます。この章では、それぞれの結合タイプとその応用について説明します。
Inner Merge
Inner Mergeは、inner joinとも呼ばれ、両方のデータフレームでキーが一致する行のみを返します。これは、Pandasのデフォルトの結合タイプです。Inner Mergeを実行するには、pd.merge()
関数を使用します。
import pandas as pd
# Sample DataFrames
data1 = {'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]}
data2 = {'key': ['B', 'D', 'E', 'F'],
'value': [5, 6, 7, 8]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# Inner Merge
merged_df = pd.merge(df1, df2, on='key', suffixes=('_df1', '_df2'))
print(merged_df)
key value_df1 value_df2
0 B 2 5
1 D 4 6
Outer Merge
Outer Mergeは、outer joinとも呼ばれ、両方のデータフレームから全ての行を返します。片方のデータフレームにキーが存在しない場合、欠損値NaNで値を埋めます。Outer Mergeを実行するには、how
パラメータを'outer'
として指定する必要があります。
# Outer Merge
merged_df = pd.merge(df1, df2, on='key', how='outer', suffixes=('_df1', '_df2'))
print(merged_df)
key value_df1 value_df2
0 A 1.0 NaN
1 B 2.0 5.0
2 C 3.0 NaN
3 D 4.0 6.0
4 E NaN 7.0
5 F NaN 8.0
Left Merge
Left Mergeは、left joinとも呼ばれ、左側のデータフレームの全ての行と、右側のデータフレームとマッチする行を返します。マッチしない場合はNaN値が使用されます。Left Mergeを実行するには、how
パラメータを'left'
として指定する必要があります。
# Left Merge
merged_df = pd.merge(df1, df2, on='key', how='left', suffixes=('_df1', '_df2'))
print(merged_df)
key value_df1 value_df2
0 A 1 NaN
1 B 2 5.0
2 C 3 NaN
3 D 4 6.0
Right Merge
Right Mergeは、right joinとも呼ばれ、右側のデータフレームの全ての行と、左側のデータフレームとマッチする行を返します。マッチしない場合はNaN値が使用されます。Right Mergeを実行するには、how
パラメータを'right'
として指定する必要があります。
# Right Merge
merged_df = pd.merge(df1, df2, on='key', how='right', suffixes=('_df1', '_df2'))
print(merged_df)
key value_df1 value_df2
0 B 2.0 5
1 D 4.0 6
2 E NaN 7
3 F NaN 8
データフレームの連結
連結は、特定の軸(行または列)を沿ってデータフレームを端から端まで結合するプロセスです。マージとは異なり、連結は列の値の一致に依存しません。代わりに、単純にデータフレームを追加します。この章では、Pandasを使用して行および列に沿ってデータフレームを連結する方法について説明します。
行に沿った連結
データフレームを行に沿って連結するには、pd.concat()
関数を使用します。デフォルトでは、関数は行に沿って連結します(axis=0
)。以下は例です。
import pandas as pd
# Sample DataFrames
data1 = {'A': [1, 2, 3],
'B': [4, 5, 6]}
data2 = {'A': [7, 8, 9],
'B': [10, 11, 12]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# Concatenation along rows
concatenated_df = pd.concat([df1, df2], ignore_index=True)
print(concatenated_df)
A B
0 1 4
1 2 5
2 3 6
3 7 10
4 8 11
5 9 12
上記の例では、ignore_index
パラメータがTrue
に設定されており、結果のデータフレームのインデックスを再設定しています。False
に設定されている場合は、元のインデックス値が保持されます。
列に沿った連結
データフレームを列に沿って連結するには、pd.concat()
関数でaxis
パラメータを1
として指定する必要があります。
# Sample DataFrames
data1 = {'A': [1, 2, 3],
'B': [4, 5, 6]}
data2 = {'C': [7, 8, 9],
'D': [10, 11, 12]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# Concatenation along columns
concatenated_df = pd.concat([df1, df2], axis=1)
print(concatenated_df)
A B C D
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12
この例では、データフレームが列方向に連結され、より幅広いデータフレームが生成されています。列方向に連結する場合、両方のデータフレームの行数は同じである必要があります。
データフレームの結合
結合は、マージと同様にデータフレームを結合する別の技術です。ただし、結合は、列の値の一致ではなく、インデックス値に基づいてデータフレームを結合することに特化しています。この章では、Pandasで利用可能な異なるタイプの結合と、join()
関数を使用してそれらを実行する方法について説明します。
Inner Join
内部結合は、両方のデータフレームでインデックス値が一致した行のみを返します。内部結合を実行するには、join()
関数を使用し、how
パラメータを'inner'
に設定します。
import pandas as pd
# Sample DataFrames
data1 = {'A': [1, 2, 3],
'B': [4, 5, 6]}
data2 = {'C': [7, 8, 9],
'D': [10, 11, 12]}
df1 = pd.DataFrame(data1, index=['X', 'Y', 'Z'])
df2 = pd.DataFrame(data2, index=['Y', 'Z', 'W'])
# Inner Join
joined_df = df1.join(df2, how='inner')
print(joined_df)
A B C D
Y 2 5 8 11
Z 3 6 9 12
Outer Join
外部結合は、両方のデータフレームから全ての行を返しますが、インデックス値が片方のデータフレームに存在しない場合はNaN値を使用して欠損値を埋めます。外部結合を実行するには、how
パラメータを'outer'
に設定します。
# Outer Join
joined_df = df1.join(df2, how='outer')
print(joined_df)
A B C D
W NaN NaN 9.0 12.0
X 1.0 4.0 NaN NaN
Y 2.0 5.0 8.0 11.0
Z 3.0 6.0 9.0 12.0
Left Join
左結合は、左側のデータフレームから全ての行と、右側のデータフレームから一致する行を返します。一致が見つからない場合はNaN値が使用されます。左結合を実行するには、how
パラメータを'left'
に設定します。
# Left Join
joined_df = df1.join(df2, how='left')
print(joined_df)
A B C D
X 1 4 NaN NaN
Y 2 5 8.0 11.0
Z 3 6 9.0 12.0
Right Join
右結合は、右側のデータフレームから全ての行と、左側のデータフレームから一致する行を返します。一致が見つからない場合はNaN値が使用されます。右結合を実行するには、how
パラメータをright'
に設定します。
# Right Join
joined_df = df1.join(df2, how='right')
print(joined_df)
A B C D
Y 2.0 5.0 8 11
Z 3.0 6.0 9 12
W NaN NaN 9 12