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以降で利用可能です。古いバージョンでは一時的なキー列を作成するなどの代替手法が必要になります。
-
Python Pandas – 元のインデックスと名前を保持したSeriesを作成する方法
Pandasで、元のインデックスとその名前(name属性)の両方を保持した新しいSeriesを作成したい場合は、index.to_series()メソッドを使用します。このメソッドを使うと、IndexオブジェクトをそのままSeriesに変換でき、インデックスラベルや名前の情報が失われません。まずは、必要なライブラリをインポートしましょう。import pandas as pdインデックスの作成次に、名前付きのPandasインデックスを作成します。ここでは「Products」という名前を持つインデックスを定義しています。index = pd.Index([Electronics,Accessor
-
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