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した時のことを記録してみました。