Мне нужно сравнить две оценки и вернуть большее из двух на основе сопоставления.
Вот мое отображение
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
Что лучше для этого делать?
Любые предложения приветствуются!