PandasのDataFrameに下から結合!:末尾にデータを追加する方法

データ分析において、複数のデータフレームを結合することは頻繁に行われます。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を使ったデータフレームの結合について理解を深めてください。