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

Python Pandasで2つのデータフレーム間の共通行を抽出する方法

2つのデータフレーム(DataFrame)間に共通して存在する行を抽出したい場合は、Pandasのmerge()メソッドを使用します。how='inner'(内部結合)を指定することで、両方のデータフレームに存在する行だけを簡単に取得できます。

サンプルデータの作成

まず、「Car」と「Units」の2つの列を持つ1つ目のデータフレームを作成します。

dataFrame1 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Tesla', 'Bentley', 'Jaguar'],
      "Units": [100, 150, 110, 80, 110, 90]
   }
)

続いて、同じ構造を持つ2つ目のデータフレームを作成します。

dataFrame2 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],
      "Units": [100, 250, 150, 80, 130, 90]
   }
)

この2つのデータフレームを見ると、車種はほぼ重なっていますが、「Units」の値が異なる行や、片方にしか存在しない車種(Tesla、Mustang)があります。完全に一致している行だけを取り出すのが今回の目的です。

共通の行を抽出するコード

共通の行を取得するには、merge()メソッドを次のように呼び出します。

dataFrame1.merge(dataFrame2, how='inner', indicator=False)
  • how='inner':内部結合を行い、両方のデータフレームに存在する行のみを残します。
  • indicator=False:各行の出所を示す追加列(_merge)を作成しません。

完全なコード例

import pandas as pd

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

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

# DataFrame2 を作成
dataFrame2 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],
      "Units": [100, 250, 150, 80, 130, 90]
   }
)

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

# 2つのデータフレームが等しいかどうかを確認
print("\nAre both the DataFrames equal? ", dataFrame1.equals(dataFrame2))

# 2つのデータフレーム間の共通の行を抽出
resData = dataFrame1.merge(dataFrame2, how='inner', indicator=False)
print("\nCommon rows between two DataFrames...\n", resData)

実行結果

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

DataFrame1 ...
        Car  Units
0      BMW    100
1    Lexus    150
2     Audi    110
3    Tesla     80
4  Bentley    110
5   Jaguar     90

DataFrame2 ...
        Car  Units
0      BMW    100
1    Lexus    250
2     Audi    150
3  Mustang     80
4  Bentley    130
5   Jaguar     90

Are both the DataFrames equal? False

Common rows between two DataFrames...
      Car  Units
0     BMW    100
1  Jaguar     90

結果のポイント

equals()メソッドによる比較では「False」となり、2つのデータフレームは完全には一致していません。しかし、merge()による内部結合の結果を見ると、すべての列の値が完全に一致している「BMW(100台)」と「Jaguar(90台)」の2行だけが共通行として抽出されています。

LexusやBentleyのように車種が一致していても「Units」の値が異なる行は除外される点に注意してください。merge()はデフォルトですべての列を結合キーとして扱うため、特定の列だけを基準に共通行を探したい場合は、on='Car'のようにonパラメータでキーとなる列を明示的に指定することも可能です。

  1. Pythonでシフト後の2つの数表間の最小差を求める方法

    ```html 問題の概要 2つの数 p と q が与えられたとき、それぞれの数が持つ無限に続く倍数の表(九九の表)を考えます。これらの表をそれぞれ r と s(ただし r, s >= 0)だけシフトした場合、2つのシフト済み表の項同士における最小の差を求めるのが本記事のテーマです。 例として、p = 7、q = 17、r = 6、s = 3 の場合の出力は 0 になります。 7の表:[7, 14, 21, 28, 35, 42, 49, ...] 17の表:[17, 34, 51, 68, 85, 102, 119, ...] 7の表を6シフトした表:[13, 20, 27, 34,

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ