質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

186閲覧

ラベル別ランキングをラベル数で割ったデータを求めたい

Forestone

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/20 11:47

前提・実現したいこと

以下のようなラベルと元データに対して、ラベル別にランキングを付けた上で
ランク値=ラベル別ランキング/ラベル別のデータ数
としてデータを返したいと考えています。

|ラベル|元データ|(返す値)ランク値|
|:--|:--:|
|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|
|:--|:--:|--:|
||||

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

やりたいことは、こういうことですかね

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'label': ['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]}) 6 7df['lavel_value'] = df.groupby('label').apply(lambda d:d[['value']].rank(ascending=False) / len(d)) 8print(df) 9# label value lavel_value 10#0 A 2.1 0.333333 11#1 A -1.5 1.000000 12#2 A -0.1 0.666667 13#3 B 4.5 0.166667 14#4 B -3.0 1.000000 15#5 B 1.1 0.333333 16#6 B -0.3 0.500000 17#7 B -0.7 0.833333 18#8 B -0.4 0.666667

投稿2019/05/20 15:57

編集2019/05/20 16:00
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Forestone

2019/05/21 11:22

まさにこういう状態です!ありがとうございます。
guest

0

python

1dataframe = ({'rabel': ['A','A','A','B','B','B','B','B','B'], 2 'value': [2.1, -1.5, -0.1, 4.5, -3.0, 1.1, -0.3, -0.7, -0.4]}) 3dataframe = pd.DataFrame(dataframe) 4 5# 特定の要素の数をカウント 6count = (dataframe['rabel'] == 'A').sum() 7print(count) 8# 3

こんな感じで要素数はカウントできると思います。
プログラムの説明についてはこちらのサイトに丸投げします。

投稿2019/05/20 12:07

mistn

総合スコア1191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mistn

2019/05/20 12:10

あとどうでもいいですがrabelではなくlabelですね。
Forestone

2019/05/21 11:23

rabelですね、すみません。 数値は教えていただいたコードで取れましたが、ラベルの数が大量かつ可変なので、綺麗に処理するにはどうしたものかなと・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問