前提・実現したいこと
以下のようなラベルと元データに対して、ラベル別にランキングを付けた上で
ランク値=ラベル別ランキング/ラベル別のデータ数
としてデータを返したいと考えています。
|ラベル|元データ|(返す値)ランク値|
|:--|:--:|
|A|2.1|0.333(=1/3)
|A|-1.5|1(=3/3)
|A|-0.1|0.666=(2/3)
|B|0.1|0.5(=3/6)
|B|4.5|0.167(=1/6)
|B|-3.0|1(=6/6)
|B|1.1|0.333(=2/6)
|B|-0.3|0.666(=4/6)
|B|-0.7|0.833(=5/6)
|C|-0.4|4/n
|・・・|・・・|
発生している問題・エラーメッセージ
ラベルに含まれるデータ数がラベルによって違うため ランク値=ラベル別ランキング/最も多いデータ数を持つラベルのデータ数 となってしまいます。 (下記はラベル「B」が最大のデータ数を持つものであった場合)
|ラベル|元値|ランク値|
|:--|:--:|
|A|2.1|0.167(=1/6)
|A|-1.5|0.5(=3/6)
|A|-0.1|0.333=(2/6)
|B|0.1|0.5(=3/6)
|B|4.5|0.167(=1/6)
|B|-3.0|1(=6/6)
|B|1.1|0.333(=2/6)
|・・・|・・・|
該当のソースコード
Python
1#イメージです 2import pandas as pd 3 4dataframe = ({'rabel': ['A','A','A','B','B','B','B','B','B'], 5 'value': [2.1, -1.5, -0.1, 4.5, -3.0, 1.1, -0.3, -0.7, -0.4]}) 6dataframe = pd.DataFrame(dataframe) 7 8divmax = lambda x: x / (x.max()) 9rank_data = dataframe.groupby(['rabel'])['value'].rank().transform(divmax) 10rank_data
試したこと
別にラベルごとにデータ数の取得を行って割ればいいのですが、綺麗に処理する方向が分かりません。
上の処理を(データフレームを引数とした)関数にしたいのでなるべく簡素に書ければと思います。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。|列1|列2|列3|
|:--|:--:|--:|
||||
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/21 11:22