はじめに
データ分析において、複数のデータフレームを結合することはよく行われます。pandasライブラリは、縦方向・横方向のデータフレームの結合を行うためのconcat関数、キーによる結合を行うためのmerge関数、およびインデックスに基づく結合を行うためのjoin関数を提供しています。
この記事では、pandasライブラリを使って、データフレームを合成する方法を紹介します。具体的には、concat関数を使った縦方向の合成、横方向の合成、merge関数を使ったデータフレームの結合、およびjoin関数を使ったデータフレームの合成について解説します。さらに、データフレーム合成時の注意点についても触れます。
concat関数を使った縦方向の合成: 基本的な使い方と実例
concat関数を使うと、複数のデータフレームを縦方向に連結することができます。基本的な使い方は、以下のようになります。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
# データフレームの連結
result = pd.concat([df1, df2, df3])
print(result)
この場合、df1、df2、df3の3つのデータフレームを縦方向に連結したデータフレームがresultに格納されます。連結する際には、引数に連結するデータフレームをリストで渡します。
次に、実際にデータフレームを連結する例を紹介します。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']})
# データフレームの連結
result = pd.concat([df1, df2, df3])
print(result.head())
実行結果は以下のようになります。
A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 0 A4 B4 C4 D4
連結したデータフレームには、元のデータフレームの行番号がそのまま残っていることがわかります。これは、引数にignore_index=Trueを指定することで変更することができます。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
df3 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']})
# データフレームの連結
result = pd.concat([df1, df2, df3], ignore_index=True)
print(result.head())
実行結果は以下のようになります。
A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 C4 D4
ignore_index=Trueを指定することで、行番号が連番に変更されたことがわかります。
concat関数を使った横方向の合成: オプションの設定方法と実例
concat関数を使うと、複数のデータフレームを横方向に連結することもできます。オプションによって、どのように連結するかを制御することができます。
以下は、基本的な使い方です。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'E': ['E0', 'E1', 'E2', 'E3'],
'F': ['F0', 'F1', 'F2', 'F3'],
'G': ['G0', 'G1', 'G2', 'G3'],
'H': ['H0', 'H1', 'H2', 'H3']})
# データフレームの連結
result = pd.concat([df1, df2], axis=1)
print(result.head())
この場合、df1とdf2の2つのデータフレームを横方向に連結したデータフレームがresultに格納されます。連結する際には、引数に連結するデータフレームをリストで渡します。また、連結方向を制御するために、axis=1を指定します。
次に、実際にデータフレームを連結する例を紹介します。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2 = pd.DataFrame({'E': ['E0', 'E1', 'E2','E3'],
'F': ['F0', 'F1', 'F2', 'F3'],
'G': ['G0', 'G1', 'G2', 'G3'],
'H': ['H0', 'H1', 'H2', 'H3']})
# データフレームの連結
result = pd.concat([df1, df2], axis=1)
print(result.head())
実行結果は以下のようになります。
A B C D E F G H 0 A0 B0 C0 D0 E0 F0 G0 H0 1 A1 B1 C1 D1 E1 F1 G1 H1 2 A2 B2 C2 D2 E2 F2 G2 H2 3 A3 B3 C3 D3 E3 F3 G3 H3
連結したデータフレームには、元のデータフレームの列がそのまま残っていることがわかります。
concat関数には、joinやkeysといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
merge関数を使ったデータフレームの結合: 結合方法の選択と実例
merge関数を使うと、2つのデータフレームをキーに基づいて結合することができます。結合方法には、内部結合、外部結合、左外部結合、右外部結合があります。
以下は、基本的な使い方です。
import pandas as pd
# データフレームの生成
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# データフレームの結合
result = pd.merge(left, right, on='key')
print(result.head())
この場合、leftとrightの2つのデータフレームをkey列をキーにして結合したデータフレームがresultに格納されます。結合する際には、引数に結合するデータフレームを渡します。また、キーとなる列名は、onオプションで指定します。
実行結果は以下のようになります。
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
左外部結合の場合、leftオプションに指定したデータフレームのすべての行が結果に含まれます。rightオプションに指定したデータフレームの中で、キーが一致する行があれば、それらの列が結果に含まれます。
右外部結合の場合、rightオプションに指定したデータフレームのすべての行が結果に含まれます。leftオプションに指定したデータフレームの中で、キーが一致する行があれば、それらの列が結果に含まれます。
merge関数には、howやsuffixesといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
join関数によるデータフレームの合成: 複数のデータフレームを結合する方法と実例
join関数を使うと、複数のデータフレームをキーに基づいて結合することができます。merge関数と同様に、結合方法には、内部結合、外部結合、左外部結合、右外部結合があります。
以下は、基本的な使い方です。
import pandas as pd
# データフレームの生成
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']},
index=['K0', 'K2', 'K3'])
top = pd.DataFrame({'E': ['E0', 'E1', 'E2'],
'F': ['F0', 'F1', 'F2']},
index=['K0', 'K1', 'K2'])
# データフレームの結合
result = left.join([right, top])
print(result)
この場合、left、right、topの3つのデータフレームを、インデックスをキーにして結合したデータフレームがresultに格納されます。結合する際には、引数に結合するデータフレームをリストで渡します。
次に、実際にデータフレームを結合する例を紹介します。
import pandas as pd
# データフレームの生成
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']},
index=['K0', 'K2', 'K3'])
top = pd.DataFrame({'E': ['E0', 'E1', 'E2'],
'F': ['F0', 'F1', 'F2']},
index=['K0', 'K1', 'K2'])
# データフレームの結合
result = left.join([right, top], how='outer')
print(result)
実行結果は以下のようになります。
A B C D E F K0 A0 B0 C0 D0 E0 F0 K1 A1 B1 NaN NaN E1 F1 K2 A2 B2 C2 D2 E2 F2 K3 NaN NaN C1 D1 NaN NaN
left、right、topの3つのデータフレームを、インデックスをキーにして結合したデータフレームがresultに格納されます。結合方法には、howオプションを指定することができます。この例では、outerを指定しています。outerを指定することで、すべてのデータを含む外部結合が行われます。
join関数には、onやhow、sortといったオプションがあります。詳細は、pandasの公式ドキュメントを参照してください。
データフレーム合成時の注意点: インデックスの扱いや欠損値処理について
データフレームを合成する際には、以下のような注意点があります。
- データフレームを連結する場合、インデックスが重複するとエラーが発生します。
- merge関数を使って結合する場合、データフレームのキーが重複すると、重複した行が複数回現れる可能性があります。
- 欠損値が含まれる場合は、欠損値をどのように扱うかについて考慮する必要があります。
以下は、インデックスの重複に関する例です。
import pandas as pd
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
'B': ['B3', 'B4', 'B5']},
index=['K2', 'K3', 'K4'])
# データフレームの連結
result = pd.concat([df1, df2])
print(result)
実行結果は以下のようになります。
A B K0 A0 B0 K1 A1 B1 K2 A2 B2 K2 A3 B3 K3 A4 B4 K4 A5 B5
K2というインデックスが重複しているため、エラーが発生しませんが、K2に対応する行が2つ現れていることがわかります。
次に、欠損値の扱いに関する例を紹介します。
import pandas as pd
import numpy as np
# データフレームの生成
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'C': ['C0', np.nan, 'C2']})
df2 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'D': ['D0', 'D1', 'D2']})
# データフレームの結合
result = pd.merge(df1, df2, on=['A', 'B'])
print(result)
実行結果は以下のようになります。
A B C D 0 A0 B0 C0 D0 1 A1 B1 NaN D1 2 A2 B2 C2 D2
df1とdf2の2つのデータフレームをAとBの列をキーにして結合しています。df1のC列に欠損値が含まれていますが、結合後のデータフレームでは、欠損値がNaNとして扱われています。
まとめ
この記事では、pandasを使ってデータフレームを合成する方法について紹介しました。
まず、concat関数を使ってデータフレームを縦方向および横方向に連結する方法を紹介しました。その後、merge関数を使ってデータフレームを結合する方法と、join関数を使って複数のデータフレームをキーに基づいて結合する方法を紹介しました。
データフレームを合成する際には、インデックスの扱いや欠損値処理に注意する必要があります。インデックスが重複する場合には、エラーが発生する可能性があるため、注意が必要です。
今回紹介した合成方法は、pandasの基本的な機能です。pandasには、さまざまな合成方法がありますので、pandasの公式ドキュメントを参照することをおすすめします。
以上で、「pandasでデータフレームを合成する方法:実践的な例とテクニック」の記事を終わります。
![[Python]基本的なコーディング方法をマスター](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/11/1-123.jpg)




![Pandasの欠損値を確認し補完する方法[Python]](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/10/1-40.jpg)