グループ内で Pandas DataFrame をランク付けする

Salman Mehmood 2023年6月21日
グループ内で Pandas DataFrame をランク付けする

この記事では、昇順および降順でデータをランク付けする方法について説明します。 Pandas の groupby() 関数を使用して、データのグループをランク付けする方法も学習します。

rank() 関数を使用して Python で Pandas DataFrame をランク付けする

ランキングは、データを操作するときや、たとえば利益がランキングに基づいて高いか低いかを判断しようとするときの一般的な手順です。 時間管理は、トップ 10 製品またはボトム 10 製品が何であるかを知ることに関心がある場合もあります。

Pandas では、データのランク付けは、シリーズの要素をその値に従ってランク付けまたはソートする操作です。 rank 操作は、SQL ROW_NUMBER に着想を得ています。または、ROW_NUMBER 操作から期待できるほとんどの結果は、Pandas の rank 操作から期待できます。

例を見るためにコードを書くことから始めましょう。

スーパーストアのデータセットを読み込み、データから月と年を抽出しました。 そして、月と年の売上高のピボット テーブルを作成しました。

import numpy as np
import pandas as pd
import datetime

Store_Data = pd.read_excel("demo_Data.xls")
Store_Data["OrderDateMonth"] = Store_Data["Order Date"].apply(lambda x: x.month)
Store_Data["OrderDateYear"] = Store_Data["Order Date"].apply(lambda x: x.year)

Mon_Year_Sales = pd.pivot_table(
    Store_Data,
    index=["OrderDateMonth"],
    columns=["OrderDateYear"],
    aggfunc="sum",
    values="Sales",
)
Mon_Year_Sales

したがって、ピボット テーブルを調べると、次のようになります。

パンダ ピボット テーブル

昇順および降順で DataFrame をランク付けする

ここで、値に基づいてこのデータをランク付けする必要があります。 Pandas ライブラリには rank() 関数があり、オプションでパラメーター ascending を取り、デフォルトでデータを昇順に並べ替えます。

rank() 関数にはいくつかの引数があり、shift+tab+tab を押すと表示されます。 すべての引数と定義が表示されます。

Pandas ランク関数の引数

Mon_Year_Sales にランク付けを適用して実行すると、これらの列がすべて取得され、数値形式が何であれ数値に変換され、昇順でランク付けされます。

Mon_Year_Sales.rank()

Pandas Rank Month and Year Sales - Ascending Order

ランクは、指定された値を使用して計算されます。

2014 年の 2 行目では、このデータが 1 位です。 ascending 引数に値を渡していないため、昇順で並べられています。

ascending 引数 False を渡すと、値の降順でシーケンスが並べ替えられます。

Mon_Year_Sales.rank(ascending=False)

さて、2014 年は 9 か月目の売上額が最も高いため、1 位になりました。

パンダランクの月と年の売上 - 降順

groupby() メソッドを使用して、Pandas のグループに基づいてデータをランク付けします

全体ではなく、値のグループに基づいてデータをランク付けする特定の要件があります。 データが次のようになっているとします。

グループに基づくパンダのランク データ

全体のランキングではなく、Profit 値のカテゴリ間でランク付けしたいとします。

Group_Data = (
    Store_Data.groupby(["OrderDateYear", "Category"])
    .agg({"Profit": "sum"})
    .reset_index()
)
Group_Data

グループに基づくパンダのランク データ - 出力 1

特定の年について、カテゴリの利益をランク付けしたいので、2014 年の場合、2 番目の値が 2014 年の最大値であるため、1 番目のランクになるようにします。

同様に、2015 年については、全体的に継続的に進むのではなく、1、2、および 3 から再び開始するような別のランキングが必要です。 次に、どのカテゴリが最高ランクであるかを知りたいのですが、どうすればそれを達成できますか?

目標を達成するために、年ごとにグループ化し、profit を選択し、ascending 引数を False に設定します。これは、トップ ランクを最大値にすることを意味します。 次に、method 引数を dense に設定します。

Group_Data["Rank_groupby"] = Group_Data.groupby("OrderDateYear")["Profit"].rank(
    ascending=False, method="dense"
)
Group_Data

実行後、Office Supplies が 1 位になり、他のグループ レベルが特定の年ごとに 1、2、および 3 と再び開始したことがわかります。

グループに基づくパンダのランク データ - 出力 2

完全なコード例:

# In[1]:
import numpy as np
import pandas as pd
import datetime

Store_Data = pd.read_excel("demo_Data.xls")
Store_Data["OrderDateMonth"] = Store_Data["Order Date"].apply(lambda x: x.month)
Store_Data["OrderDateYear"] = Store_Data["Order Date"].apply(lambda x: x.year)

Mon_Year_Sales = pd.pivot_table(
    Store_Data,
    index=["OrderDateMonth"],
    columns=["OrderDateYear"],
    aggfunc="sum",
    values="Sales",
)
Mon_Year_Sales

# In[2]:

Mon_Year_Sales.rank()

# In[3]:

Mon_Year_Sales.rank(ascending=False)

# In[4]:

Store_Data.head(2)

# In[5]:

Group_Data = (
    Store_Data.groupby(["OrderDateYear", "Category"])
    .agg({"Profit": "sum"})
    .reset_index()
)
Group_Data

# In[6]:

Group_Data["Rank_groupby"] = Group_Data.groupby("OrderDateYear")["Profit"].rank(
    ascending=False, method="dense"
)
Group_Data

ここから関連する回答をさらに読んでください。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Pandas DataFrame