как сравнить и вернуть более низкие баллы на основе ранжирования - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно сравнить две оценки и вернуть большее из двух на основе сопоставления.

Вот мое отображение

mapping=pd.DataFrame({'rank': {0: 1, 1: 2, 2: 3, 3: 4},
 'score1': {0: 'a', 1: 'aa', 2: 'b', 3: 'bb'},
 'score2': {0: 'x', 1: 'xx', 2: 'y', 3: 'yy'}})

   rank score1 score2
0     1      a      x
1     2     aa     xx
2     3      b      y
3     4     bb     yy

На основании приведенного выше сопоставления, если мои входные данные выглядят следующим образом:

data=pd.DataFrame({'score1': {0: 'a', 1: 'aa', 2: 'b', 3:nan}, 'score2': {0: 'x', 1: nan, 2: 'x', 3: nan}})
  score1 score2
0      a      x
1     aa    NaN
2      b      x
3     NaN   NaN

Я хочу вернуть наименьшее из двух баллов на основе приведенного выше рейтинга: если один балл равен Nan, он игнорируется, если два балла имеют одинаковый рейтинг, один будет выбран случайным образом.

  score1 score2 lower_of_two
0      a      x            a
1     aa    NaN           aa
2      b      x            b
3     NaN   NaN          NaN

То, что я сейчас делаю, - сначала добавьте ранжирование в DataFrame, а затем используйте функцию get_lower_rating, чтобы получить меньшее из двух значений, но мне нужно обработать все случаи Nan, что очень громоздко.

  score1 score2  rank1  rank2 
0      a      x      1    1.0          
1     aa    NaN      2    NaN        
2      b      x      3    1.0   

def get_lower_rating(row):
    rank1 = row['rank1']
    rank2 = row['rank2']
    out_col = 'lower_of_two'

    if not rank1 and not rank2:
        row[out_col] = None
        return row

    if not rank1 and rank2:
        row[out_col] = row['score2']
        return row

    if rank1 and not rank2:
        row[out_col] = row['score1']
        return row

    if rank1 <= rank2:
        row[out_col] = row['score2']
    else:
        row[out_col] = row['score1']

    return row

Что лучше для этого делать?

Любые предложения приветствуются!

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете создать словарь сопоставления с помощью pd.melt.Затем используйте расширенную индексацию NumPy:

d = pd.melt(mapping, id_vars=['rank'], value_vars=['score1', 'score2'])\
      .set_index('value')['rank'].to_dict()

row_idx = np.arange(len(data.index))
col_idx = data[['score1', 'score2']].applymap(d.get).fillna(-1).values.argmax(1)

data['lower_of_two'] = data.values[row_idx, col_idx]

print(data)

  score1 score2 lower_of_two
0      a      x            a
1     aa    NaN           aa
2      b      x            b
3    NaN    NaN          NaN
...