表形式のデータを扱うのに便利なpandas.DataFrame
。
CSVやEXCELのデータを取り込んで、集計したり共通のキー項目を使って結合したりできる。
その結合だが、ときには結合条件を指定せずに全組合せを取得したいこともあるだろう。
しかしどうすればいいのか。
そこで今回はpandas.DataFrameで条件なしクロス結合で全組合せ取得する方法について紹介する。
この記事を書いている人
記事を読むメリット
pandas.DataFrameで条件なしクロス結合で全組合せ取得する方法がわかり、pandasでのデータ結合が得意になる
pandas.DataFrameを結合するmerge
2つのデータフレームを結合するときには merge
が使われる。
使い方としては以下のように2つのデータフレームと、共通のキーとなる項目を pd.merge()
の引数に指定する。
SAMPLE
import pandas as pd data_list1 = [ ["a",1], ["b",2], ["c",3], ["d",4] ] col_list1 = ["column1-1","key"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # column1-1 key # 0 a 1 # 1 b 2 # 2 c 3 # 3 d 4 data_list2 = [ ["e",1], ["f",2], ["g",3], ["h",4] ] col_list2 = ["column2-1","key"] df2 = pd.DataFrame(data=data_list2, columns=col_list2) print(df2) # column2-1 key # 0 e 1 # 1 f 2 # 2 g 3 # 3 h 4 df_crossjoin = pd.merge( df1, df2, on="key" ) print(df_crossjoin) # column1-1 key column2-1 # 0 a 1 e # 1 b 2 f # 2 c 3 g # 3 d 4 h
すると共通となるキー項目を使って2つのデータフレームを結合できる。
mergeでクロス結合
では全組合せ取得するためにキー項目を指定せずに merge
したらどうなるか。
SAMPLE
import pandas as pd data_list1 = [ ["a"], ["b"], ["c"], ["d"] ] col_list1 = ["column1-1"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # column1-1 # 0 a # 1 b # 2 c # 3 d data_list2 = [ ["e"], ["f"], ["g"], ["h"] ] col_list2 = ["column2-1"] df2 = pd.DataFrame(data=data_list2, columns=col_list2) print(df2) # column2-1 # 0 e # 1 f # 2 g # 3 h df_crossjoin = pd.merge( df1, df2 ) print(df_crossjoin) # MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
merge
で共通カラムを指定しないと↑のようにエラーになる。
ではどうすればいいのか。
pandas.DataFrameで条件なしクロス結合で全組合せ取得する方法
データフレームを結合するのに merge
を使いたい、しかし共通項目が無いとエラーになってしまう。
ではどうやって条件なしクロス結合で全組合せ取得するのか。
方法としては how = "cross"
のパラメータを使う方法がある。
SAMPLE
df_crossjoin = pd.merge( df1, df2, how = "cross" ) print(df_crossjoin) # column1-1 column2-1 # 0 a e # 1 a f # 2 a g # 3 a h # 4 b e # 5 b f # 6 b g # 7 b h # 8 c e # 9 c f # 10 c g # 11 c h # 12 d e # 13 d f # 14 d g # 15 d h
このように how = "cross"
のパラメータを使えばクロス結合で全組合せ取得できる。
ダミーの共通キーを設定する
how = "cross"
のパラメータの他に、ダミーの共通キー項目を作るという方法でもクロス結合ができる。
SAMPLE
import pandas as pd data_list1 = [ ["a"], ["b"], ["c"], ["d"] ] col_list1 = ["column1-1"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) df1["dummy_key"] = 1 print(df1) # column1-1 dummy_key # 0 a 1 # 1 b 1 # 2 c 1 # 3 d 1 data_list2 = [ ["e"], ["f"], ["g"], ["h"] ] col_list2 = ["column2-1"] df2 = pd.DataFrame(data=data_list2, columns=col_list2) df2["dummy_key"] = 1 print(df2) # column2-1 dummy_key # 0 e 1 # 1 f 1 # 2 g 1 # 3 h 1 df_crossjoin = pd.merge( df1, df2, on="dummy_key" ) print(df_crossjoin) # column1-1 dummy_key column2-1 # 0 a 1 e # 1 a 1 f # 2 a 1 g # 3 a 1 h # 4 b 1 e # 5 b 1 f # 6 b 1 g # 7 b 1 h # 8 c 1 e # 9 c 1 f # 10 c 1 g # 11 c 1 h # 12 d 1 e # 13 d 1 f # 14 d 1 g # 15 d 1 h
全行で同じ値のダミーのカラムを作り、そのダミーカラムを使って結合することで全組合せを取得するクロス結合を実現できる。
ちなみにダミーカラムを見せたくないのであれば、drop
で落としてしまえばよい。
SAMPLE
df_crossjoin.drop(columns=["dummy_key"], inplace=True) print(df_crossjoin) # column1-1 column2-1 # 0 a e # 1 a f # 2 a g # 3 a h # 4 b e # 5 b f # 6 b g # 7 b h # 8 c e # 9 c f # 10 c g # 11 c h # 12 d e # 13 d f # 14 d g # 15 d h
まとめ
今回はpandas.DataFrameで条件なしクロス結合で全組合せ取得する方法について解説した。
ポイントは以下の通り。
ココがポイント
- データフレームの結合には
merge
を使う merge
は結合用のキー項目が必要- クロス結合をする場合は
how = "cross"
のパラメータを使う - ダミーカラムを作ってクロス結合することもできる
on
の指定を無くすだけだとエラーになりますが、 how
を指定すればクロス結合できるようになるんですね他にもpandas関連の記事もあるので、もし気になるものがあれば見てみて欲しい。