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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

939閲覧

pandasで最小値から大きい点数をつける方法について

help-man

総合スコア58

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/11/18 03:19

タイトルのとおりです

python

1df = pd.DataFrame({'col1': [10, 5, 20, 15], 2 'col2': [0.1, 0.5, 2.5, 1.5]}, 3 index=['a', 'b', 'c', 'd'])

でcol1とcol2を掛け合わせてa=1.0,b=2.5,c=50.0,d=22.5でaが4点、bが3点、cが1点、dが2点としたいのですが

python

1df = pd.DataFrame({'col1': [10, 5, 20, 15], 2 'col2': [0.1, 0.5, 2.5, 1.5]}, 3 index=['a', 'b', 'c', 'd']) 4df['z']=df['col1']*df['col2']#col1とcol2を掛け算 5aaa =df.applymap(float).rank(method='min').agg(['sum'], axis=1) 6print(aaa) 7""" 8 sum 9a 4.0 10b 5.0 11c 12.0 12d 9.0 13 14"""

とでてしまいます
【aaa =df.applymap(float).rank(method='min').agg(['sum'], axis=1)】の部分が違うことはなんとなく分かります
どうしたら
"""
sum
a 4
b 3
c 2
d 1
"""
とできるのしょうか?
何卒ご教授よろしくお願いいたします

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

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

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

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

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

guest

回答3

0

ベストアンサー

Series.rank()で ascending=False をつければいいと思います。
(同点のときどうするか書かれていないので、下記ではとりあえずmaxにしていますが、適当に変更してください)

python

1df['sum'] = df['z'].rank(ascending=False, method='max').astype(int)

投稿2021/11/18 04:41

bsdfan

総合スコア4567

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

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

help-man

2021/11/18 07:29

コメントありがとうございました 他の2人の方法も無事できましたがbsdfanさんが一番早かったということでベストアンサーにさせていただきました
melian

2021/11/18 07:36

> help-man 名前間違えてますけど、ベストアンサーは bsdfan さんの方にする方が適切ですよ。
help-man

2021/11/18 08:37

melianさん大変失礼いたしました
guest

0

以下のようにします。

python

1df = pd.DataFrame({'col1': [10, 5, 20, 15], 2 'col2': [0.1, 0.5, 2.5, 1.5]}, 3 index=['a', 'b', 'c', 'd']) 4df['z']=df['col1']*df['col2'] 5df_temp = df.sort_values('z') 6df_temp['sum'] = list(range(len(df_temp), 0, -1)) 7df['sum'] = df_temp['sum']

実行結果

python

1>>> df['z']=df['col1']*df['col2'] 2>>> df_temp = df.sort_values('z') 3>>> df_temp['sum'] = list(range(len(df_temp), 0, -1)) 4>>> df['sum'] = df_temp['sum'] 5>>> print(df) 6 col1 col2 z sum 7a 10 0.1 1.0 4 8b 5 0.5 2.5 3 9c 20 2.5 50.0 1 10d 15 1.5 22.5 2

投稿2021/11/18 03:50

ppaul

総合スコア24666

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

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

0

python

1print(-(df['col1']*df['col2']).argsort() + len(df)) 2 3# 4a 4 5b 3 6c 1 7d 2 8dtype: int64

投稿2021/11/18 03:37

melian

総合スコア19796

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

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

bsdfan

2021/11/18 08:55 編集

今回の例では正しく出ていますが、データによっては間違った結果になると思います。 ['a', 'col1'] を 1000 にすると、正しくは1, 4, 2, 3なのに、3, 1, 2, 4 という結果になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問