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

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

ただいまの
回答率

90.33%

  • Python 3.x

    7456questions

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

  • pandas

    683questions

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

Pandasで複数条件の順位付け

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 491

barobaro

score 408

Pandasで複数条件('勝点', '得失点差', '得点')で順位付けしたいのですがどうすればいいのでしょうか

1つの条件だけなら

df['rank'] = df['勝点'].rank(ascending=False, method='dense')

並び替えだけだともし全部が同じ場合は順位が違ってしまいます。

df.sort_values(['勝点', '得失点差', '得点'], ascending=[False, False, False], inplace=True)
df.reset_index(inplace=True)
df.index = df.index + 1

どのようにすればいいのでしょうか

import pandas as pd

url = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1277'

dfs = pd.read_html(url, skiprows=2)

df = dfs[0]

# タイトル行追加
df.columns = ['順位', 'チーム名', '勝点', '試合数', '勝利', '勝利H', '勝利A', '引分', '引分H', '引分A', '敗戦', '敗戦H', '敗戦A', '得失点差', '得点', '失点']

# タイトル列追加
df = df.set_index('順位')

df['rank'] = df1.loc[:,['勝点', '得失点差', '得点']].rank(ascending=False, method='dense')
# df['rank'] = df['勝点'].rank(ascending=False, method='dense')

df.sort_values('rank')
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

df.sort_valuesでやってから、一回ループするという安直な解決法があります。

# こんな感じでループする
rank_lst = []
rank = 0
before = None
for index, now in df.iterrows():
    if any(now[['勝点', '得失点差', '得点']] != before):
        rank += 1
    rank_lst.append(rank)
    before = now[['勝点', '得失点差', '得点']]

# Seriesに変換して新たな列として追加

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/27 23:32

    TypeError: 'NoneType' object is not subscriptable
    がでます。
    nowをrowにしてみましたが同じエラーになります。

    一度並び替えをしてから上から3つのリストが同じか調べて違う場合はカウント
    最後に結合する方法ということですねちょっと試してみます。

    キャンセル

  • 2018/05/27 23:39

    あー、ごめんなさい。beforeが最初はNoneだから普通にbefore[['勝点', '得失点差', '得点']]で落ちます
    書き直します

    キャンセル

  • 2018/05/27 23:41

    追記しました。これだとSeriesとNoneの比較は各要素とNoneの比較、Series同士の比較は要素同士の比較になって動くと思います

    キャンセル

  • 2018/05/27 23:54

    できましたありがとうございます。

    if not all(now[['勝点', '得失点差', '得点']] == before):
    この部分がすこしよくわからないのですがNoneで落ちないようにするためですか

    キャンセル

  • 2018/05/27 23:58

    # Seriesに変換して新たな列として追加とありますが
    df['rank'] = rank_lst
    ではだめなのでしょうか?

    キャンセル

  • 2018/05/27 23:59

    now[['勝点', '得失点差', '得点']] == Noneで[False, False, Flase]というSeriesになり、組み込み関数のallはiterableの全要素の論理積を取るだけです
    直感的ではなかったので、回答は
    if any(now[['勝点', '得失点差', '得点']] != before):
    に書き換えてあります。anyは要素すべての論理和なので、いずれか1つでも値が違うものがあればインクリメントする、という処理を直感的に記述できます。

    キャンセル

  • 2018/05/28 00:00

    df['rank'] = rank_lst
    でも別に構いませんね

    キャンセル

  • 2018/05/28 00:09

    丁寧な解説どうもありがとうございまいました。
    all・anyを使ったことがなかったので勉強になりました。

    キャンセル

0

勝点・得失点・得点を計算して評価値を作成、評価値を使って順位付け

# 得失点がマイナス対策に勝点+1
df['評価値'] = ((df['勝点'] + 1) * 10000) + (df['得失点'] * 100) + df['得点']

# ランキング
df['rank'] = df['評価値'].rank(ascending=False, method='min')

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python 3.x

    7456questions

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

  • pandas

    683questions

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