データ分析において、複数のデータフレームを結合することは頻繁に行われます。Pandasには、concat、merge、joinなどの結合方法が用意されていますが、本記事ではconcatを使用した下からの結合について解説します。
DataFrameの結合方法
Pandasで利用できる主要な結合方法は以下の通りです。
- concat
- merge
- join
concatは、データフレームを結合するための最も基本的な方法であり、デフォルトでは縦方向に結合します。mergeは、共通の列を持つ2つのデータフレームを結合する方法であり、SQLのJOINに相当します。joinは、データフレーム同士を結合するための便利なメソッドで、mergeと似たような使い方ができます。
concatを使用した下からの結合
concatを使用して、下からの結合を行う方法を解説します。
まず、下から結合するためには、データフレームの順序を逆にする必要があります。以下の例では、10行のデータフレームdf1と、5行のデータフレームdf2を用意し、concatを使用して下から結合します。
import pandas as pd import numpy as np df1 = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D']) df2 = pd.DataFrame(np.random.randn(5, 4), columns=['A', 'B', 'C', 'D']) result = pd.concat([df1, df2], ignore_index=True) print(result.tail())
出力結果は以下の通りです。
A B C D 10 -0.592127 -0.129679 0.279885 -0.547182 11 0.851341 1.126140 0.322599 0.416096 12 -0.425432 0.017481 0.954358 1.296111 13 0.012299 1.008837 0.769124 -0.364248 14 0.331902 0.628098 -0.431949 0.128704
ignore_index=Trueを指定することで、結合後のデータフレームのインデックスが自動的に振り直されます。このため、df1とdf2の行番号が重複することを防ぐことができます。
結合時の注意点
結合を行う際に注意するポイントをいくつか紹介します。
インデックスのリセット
データフレームを結合すると、インデックスが重複することがあります。この場合、ignore_index=Trueを指定することで、自動的にインデックスがリセットされます。
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']}) result = pd.concat([df1, df2], ignore_index=True) print(result)
出力結果は以下の通りです。
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 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7
重複データの対処
データフレームを結合する際に、重複したデータが含まれる場合があります。この場合、drop_duplicatesを使用して、重複した行を削除することができます。
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'C': ['C0', 'C1', 'C2', 'C3']}) result = pd.concat([df1, df2], axis=1) result = result.loc[:,~result.columns.duplicated()] print(result)
出力結果は以下の通りです。
key A B C 0 K0 A0 B0 C0 1 K1 A1 B1 C1 2 K2 A2 B2 C2 3 K3 A3 B3 C3
axis=1を指定することで、横方向の結合を行っています。また、~result.columns.duplicated()を使用することで、重複した列を削除しています。
実践例
以下の例では、実際のデータフレームを使用して、下から結合する方法を示します。
df1 = pd.read_csv('data1.csv') df2 = pd.read_csv('data2.csv') result = pd.concat([df1, df2], ignore_index=True) print(result.tail())
このように、CSVファイルからデータフレームを読み込んで、concatを使用して下から結合することができます。
応用
複数のデータフレームを一度に結合する方法や、条件に基づいて結合する方法を紹介します。
複数のデータフレームを一度に結合する
複数のデータフレームを一度に結合するには、リストに格納してconcat関数に渡すことができます。
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], ignore_index=True) print(result)
出力結果は以下の通りです。
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 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11
条件に基づいて結合する
条件に基づいて結合する場合は、merge関数を使用します。以下の例では、2つのデータフレームを共通の列(’key’)で結合しています。
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) result = pd.merge(df1, df2, on='key') print(result)
出力結果は以下の通りです。
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
まとめ
本記事では、PandasでDataFrameに下から結合する方法を解説しました。Pandasには、concat、merge、joinなどの結合方法が用意されており、目的に合わせて使い分けることができます。結合時には、インデックスのリセットや重複データの対処に注意する必要があります。また、複数のデータフレームを一度に結合する方法や、条件に基づいて結合する方法も紹介しました。
この記事を参考にして、Pandasを使ったデータフレームの結合について理解を深めてください。