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()方式を使い分けるとよいでしょう。
-
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
-
欠損値を含む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