Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python Pandas – merge()で2つのDataFrameからデカルト積(直積)を作成する方法

PandasでDataFrame同士をマージするにはmerge()関数を使用します。両方のDataFrameに対してデカルト積(直積)を実行したい場合は、merge()関数の「how」パラメータに以下のように指定します。

how = "cross"

デカルト積とは

デカルト積(直積)とは、一方のDataFrameの各行と、もう一方のDataFrameのすべての行を組み合わせた結果を指します。例えば、4行のDataFrameと3行のDataFrameをクロス結合すると、4 × 3 = 12行の結果が得られます。

Pandasライブラリのインポート

まず、エイリアス(別名)を付けてPandasライブラリをインポートします。

import pandas as pd

DataFrame1の作成

1つ目のDataFrameを作成します。

dataFrame1 = pd.DataFrame(
    {
        "Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
        "Units": [100, 150, 110, 120]
    }
)

DataFrame2の作成

続いて、2つ目のDataFrameを作成します。

dataFrame2 = pd.DataFrame(
    {
        "Car": ['BMW', 'Tesla', 'Jaguar'],
        "Reg_Price": [7000, 8000, 9000]
    }
)

how="cross"でマージしてデカルト積を作成

次に、「how」パラメータに"cross"を指定してDataFrameをマージし、デカルト積を作成します。

mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")

完全なサンプルコード

以下が全体のコードです。

import pandas as pd

# DataFrame1を作成
dataFrame1 = pd.DataFrame(
    {
        "Car": ['BMW', 'Mustang', 'Bentley', 'Jaguar'],
        "Units": [100, 150, 110, 120]
    }
)

print("DataFrame1 ...\n", dataFrame1)

# DataFrame2を作成
dataFrame2 = pd.DataFrame(
    {
        "Car": ['BMW', 'Tesla', 'Jaguar'],
        "Reg_Price": [7000, 8000, 9000]
    }
)

print("\nDataFrame2 ...\n", dataFrame2)

# 「how」パラメータに"cross"を指定してマージ(デカルト積)
mergedRes = pd.merge(dataFrame1, dataFrame2, how="cross")
print("\nデカルト積によるマージ結果...\n", mergedRes)

実行結果

上記のコードを実行すると、次のような出力が得られます。

DataFrame1 ...
      Car  Units
0     BMW    100
1  Mustang    150
2  Bentley    110
3   Jaguar    120
DataFrame2 ...
     Car  Reg_Price
0    BMW       7000
1   Tesla      8000
2  Jaguar      9000

デカルト積によるマージ結果...
      Car_x  Units   Car_y  Reg_Price
0      BMW    100      BMW       7000
1      BMW    100    Tesla       8000
2      BMW    100   Jaguar       9000
3   Mustang    150      BMW       7000
4   Mustang    150    Tesla       8000
5   Mustang    150   Jaguar       9000
6   Bentley    110      BMW       7000
7   Bentley    110    Tesla       8000
8   Bentley    110   Jaguar       9000
9    Jaguar    120      BMW       7000
10   Jaguar    120    Tesla       8000
11   Jaguar    120   Jaguar       9000

ポイントのまとめ

  • デカルト積を作成するには、pd.merge()how="cross"を使用します。
  • 両方のDataFrameに同名の列(この例では「Car」)がある場合、自動的に_x_yの接尾辞が付与されて区別されます。
  • 結果の行数は、片方の行数 × もう片方の行数になります(この例では4 × 3 = 12行)。
  • how="cross"はPandas 1.2.0以降で利用可能です。古いバージョンでは一時的なキー列を作成するなどの代替手法が必要になります。
  1. Python Pandas – 元のインデックスと名前を保持したSeriesを作成する方法

    Pandasで、元のインデックスとその名前(name属性)の両方を保持した新しいSeriesを作成したい場合は、index.to_series()メソッドを使用します。このメソッドを使うと、IndexオブジェクトをそのままSeriesに変換でき、インデックスラベルや名前の情報が失われません。まずは、必要なライブラリをインポートしましょう。import pandas as pdインデックスの作成次に、名前付きのPandasインデックスを作成します。ここでは「Products」という名前を持つインデックスを定義しています。index = pd.Index([Electronics,Accessor

  2. Python Pandas – subsetを指定してdrop_duplicates()で重複値の最後のエントリのみを表示する方法

    重複する値の中から最後のエントリのみを表示したい場合は、drop_duplicates() メソッドの keep パラメータに last を指定します。drop_duplicates() は、DataFrame内の重複行を削除するためのメソッドです。 DataFrameの作成 まずは、「Car(車種)」「Place(地域)」「UnitsSold(販売台数)」の3つの列を持つDataFrameを作成しましょう。 import pandas as pd dataFrame = pd.DataFrame({ Car: [BMW, Mercedes, Lamborghini, BMW, Mer