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

Python Pandas – concat()を使って2つのDataFrame間の共通行を取得する方法

Pandasでは、concat()関数を使うことで、2つのDataFrame(データフレーム)に共通する行を簡単に抽出できます。この記事では、concat()とgroupby()を組み合わせて共通行を取得する手順を、サンプルコードと実行結果とともにわかりやすく解説します。

DataFrame1の作成

まず、「Car」と「Reg_Price」の2つの列を持つDataFrame1を作成します。

dataFrame1 = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
        "Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
    }
)

DataFrame2の作成

続いて、同じ列構成を持つDataFrame2を作成します。

dataFrame2 = pd.DataFrame(
    {
        "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
        "Reg_Price": [1200, 1500, 1000, 800, 1100, 1000]
    }
)

共通行を取得する手順

2つのDataFrameの共通行を見つけるには、以下の4つのステップを実行します。

ステップ1:concat()でDataFrameを連結する

dfRes = pd.concat([dataFrame1, dataFrame2])

ステップ2:インデックスをリセットする

dfRes = dfRes.reset_index(drop=True)

ステップ3:すべての列をキーにグループ化する

dfGroup = dfRes.groupby(list(dfRes.columns))

ステップ4:カウントが1より大きい行を抽出する

各グループの長さを取得して出現回数を計算します。カウントが1より大きい場合、その行は両方のDataFrameに存在すること、すなわち共通行であることを意味します。

res = [k[0] for k in dfGroup.groups.values() if len(k) > 1]

完全なサンプルコード

以下は、ここまでの手順をまとめた完全なコード例です。

import pandas as pd

# DataFrame1を作成
dataFrame1 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
      "Reg_Price": [1000, 1500, 1100, 800, 1100, 900]
   }
)
print("DataFrame1 ...\n", dataFrame1)

# DataFrame2を作成
dataFrame2 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
      "Reg_Price": [1200, 1500, 1000, 800, 1100, 1000]
   }
)
print("\nDataFrame2 ...\n", dataFrame2)

# 2つのDataFrame間の共通行を検索
dfRes = pd.concat([dataFrame1, dataFrame2])

# インデックスをリセット
dfRes = dfRes.reset_index(drop=True)

# 列をキーにグループ化
dfGroup = dfRes.groupby(list(dfRes.columns))

# 各行の長さを取得してカウントを計算
# カウントが1より大きい場合は共通行を意味する
res = [k[0] for k in dfGroup.groups.values() if len(k) > 1]

print("\nCommon rows ...\n", dfRes.reindex(res))

実行結果

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

DataFrame1 ...
        Car  Reg_Price
0       BMW       1000
1     Lexus       1500
2      Audi       1100
3     Tesla        800
4   Bentley       1100
5    Jaguar        900

DataFrame2 ...
        Car  Reg_Price
0       BMW       1200
1     Lexus       1500
2      Audi       1000
3     Tesla        800
4   Bentley       1100
5    Jaguar       1000

Common rows ...
        Car  Reg_Price
3     Tesla        800
1     Lexus       1500
4   Bentley       1100

補足:merge()を使った代替方法

共通行の抽出には、merge()関数を使う方法もあります。pd.merge(dataFrame1, dataFrame2, how='inner')のように内部結合を行えば、両方のDataFrameに存在する行だけをシンプルに取得できます。連結後のグループ化が必要ないため、コードがより簡潔になります。目的やデータの規模に応じて、concat()方式とmerge()方式を使い分けるとよいでしょう。

  1. Python Pandas・Seabornのswarmplotで2つのカテゴリ変数を使ってデータをグループ化する方法

    Seabornのスウォームプロット(Swarm Plot)は、点が重ならないように配置されたカテゴリ別散布図を描画するための機能です。この描画には seaborn.swarmplot() を使用します。スウォームを2つのカテゴリ変数でグループ化したい場合は、swarmplot() の x、y、または hue パラメータにそれらの変数を指定します。 ここでは、CSVファイル「Cricketers2.csv」に保存されたデータセットを例に説明します。 必要なライブラリのインポート まず、必要なライブラリをインポートします。 import seaborn as sb import pandas as

  2. 欠損値を含むPython Pandasの2つのDataFrameを比較する方法

    はじめにPandasでは、欠損値(missing value)を表すためにNumPyのNaN(np.nan)オブジェクトを使用します。このNumPyのNaN値には、興味深い数学的な特性がいくつかあります。例えば、NaNは自分自身と等しくないという性質を持っています。一方、PythonのNoneオブジェクトは、自分自身と比較するとTrueと評価されます。np.nanの基本的な挙動まず、いくつかの例を見て、np.nanがどのように振る舞うのかを理解しましょう。import pandas as pd import numpy as np # PythonのNoneオブジェクトを自分自身と比較 pr