python – pandasでSQLのようにUNION

python – pandasでSQLのようにUNION

業務を行なっているとdata lakeから直接データ取得して前処理しなければならない場合によく出くわします。そのため、大量データをpandasで処理する機会が非常に多いように思います。

そこで今回は、個人的に少し利用頻度の高いpython – pandasでSQLのようにUNIONした時のことを記録しようと思います。

1. 前処理

まずは、pandasをimportしてから、データを作成していきます。Data frameのdf1, df2, df3をそれぞれ作成していきます。

In [1]: import pandas as pd

In [2]: df1 = pd.DataFrame(
   ...:     {
   ...:         "A": ["A0", "A1", "A2", "A3"],
   ...:         "B": ["B0", "B1", "B2", "B3"],
   ...:         "C": ["C0", "C1", "C2", "C3"],
   ...:         "D": ["D0", "D1", "D2", "D3"],
   ...:     },
   ...:     index=[0, 1, 2, 3],
   ...: )
   ...: df1

Out[2]:
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3

In [3]: df2 = pd.DataFrame(
   ...:     {
   ...:         "A": ["A4", "A5", "A6", "A7"],
   ...:         "B": ["B4", "B5", "B6", "B7"],
   ...:         "C": ["C4", "C5", "C6", "C7"],
   ...:         "D": ["D4", "D5", "D6", "D7"],
   ...:     },
   ...:     index=[4, 5, 6, 7],
   ...: )
   ...: df2
Out[3]:
    A   B   C   D
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

In [4]: df3 = pd.DataFrame(
   ...:     {
   ...:         "A": ["A8", "A9", "A10", "A11"],
   ...:         "B": ["B8", "B9", "B10", "B11"],
   ...:         "C": ["C8", "C9", "C10", "C11"],
   ...:         "D": ["D8", "D9", "D10", "D11"],
   ...:     },
   ...:     index=[8, 9, 10, 11],
   ...: )
   ...: df3
Out[4]:
      A    B    C    D
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

2. pandas concatを使用してSQLのようにUNION

まず、SQLでの実装イメージを確認していきます。それぞれdf1, df2, df3がテーブルであると仮定してSQLの実装イメージを見ていきます。

# SQL
SELECT
    *
FROM
    df1
UNION ALL
SELECT
    *
FROM
    df2
UNION ALL
SELECT
    *
FROM
    df3
;

Out:
      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

では、pythonコードに戻ります。pandasを使用して、df1, df2, df3をSQLのようにUNIONしていきます。ここでは、concat関数を使用します。

In [5]: pd.concat([df1, df2, df3])

Out[5]:
      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

pandas docでは、frameを作成してからconcatしているのですが、個人的にはいつもスキップしてしまっています。念のため公式の方法も記載します。まずは、frameを作成します。

In [6]: frame = [df1, df2, df3]
   ...: frame

Out[6]:
[    A   B   C   D
 0  A0  B0  C0  D0
 1  A1  B1  C1  D1
 2  A2  B2  C2  D2
 3  A3  B3  C3  D3,
     A   B   C   D
 4  A4  B4  C4  D4
 5  A5  B5  C5  D5
 6  A6  B6  C6  D6
 7  A7  B7  C7  D7,
       A    B    C    D
 8    A8   B8   C8   D8
 9    A9   B9   C9   D9
 10  A10  B10  C10  D10
 11  A11  B11  C11  D11]

続いて、作成したframeを使用して、Data frameをconcat関数で結合していきます。

In [7]: pd.concat(frame)

Out[7]:
      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

3. pandas appendを使用してSQLのようにUNION

では、今度は同様にpandasのappendを使用して、SQLのように”df1″と”df2″をUNIONしてみます。

In [8]: df1.append(df2)

Out[8]:
    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

2つ以上のData frameの結合は、以下のように記載します。個人的には、loop内でData frameの結合をすることが多いので、2つ以上のData frameの結合にはあまり遭遇しませんが、いかに実装していきます。

In [9]: df1.append([df2, df3])

Out[9]:
      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

この場合はconcat関数の方がシンプルかもしれません。

4. まとめ

ということで今回は、python codeの中でpython – pandasでSQLのようにUNIONした時のことを記録してみました。

(Visited 1,368 times, 7 visits today)