Python

pandas.DataFrameで条件なしクロス結合で全組合せ取得する方法

pandasで2つのデータフレームを結合するときに、結合条件なしの全組合せを取得する方法って無い?


表形式のデータを扱うのに便利なpandas.DataFrame

CSVやEXCELのデータを取り込んで、集計したり共通のキー項目を使って結合したりできる。

その結合だが、ときには結合条件を指定せずに全組合せを取得したいこともあるだろう。

しかしどうすればいいのか。

そこで今回はpandas.DataFrameで条件なしクロス結合で全組合せ取得する方法について紹介する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。

記事を読むメリット

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を使いたい、しかし共通項目が無いとエラーになってしまう

ではどうやって条件なしクロス結合で全組合せ取得するのか。

方法としてはダミーの共通キー項目を作るという方法がある。

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 は結合用のキー項目が必要
  • クロス結合の場合はダミーカラムを作って結合する


ダミーカラムで工夫すればクロス結合できますが、工夫しなくても on の指定無してクロス結合できるようになってほしいですね


他にもpandas関連の記事もあるので、もし気になるものがあれば見てみて欲しい

ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-Python
-

© 2022 ITips