Замените значения в фрейме данных на основе ранга

#python

Вопрос:

У меня есть 2 следующих кадра данных:

Ранг:

     A   B   C   D
0   85  88  44  80
1   22  34  80  92
2   80  80   2  31
 

и Ценность:

           a         b         c         d
0  0.671399  0.101208 -0.181532  0.241273
1  0.446172 -0.243316  0.051767  1.577318
2  0.614758  0.075793 -0.451460 -0.012493
 

В таблице «Значение» я хотел бы заменить все значения, для которых ранг > 80, значением, имеющим ранг = 80 (по столбцам)

До сих пор у меня был итеративный процесс, который занимает слишком много времени, и, безусловно, есть питонический способ сделать это с помощью сопоставления, но я не могу понять синтаксис. Спасибо за помощь

Ответ №1:

поскольку индексы совпадают, вы можете использовать .loc[] для установки значения, для этого можно использовать цикл for для всех столбцов

 for column in value.columns:
    value.loc[rank[column.upper()] > 80, column] = (
        value.loc[list(rank[column.upper()]).index(80), column])
 

выход:

       a         b         c         d
0  0.614758  0.075793 -0.181532  0.241273
1  0.446172 -0.243316  0.051767  0.241273
2  0.614758  0.075793 -0.451460 -0.012493
 

Ответ №2:

Вы можете использовать where функцию pandas для условной замены

 (value.rename(columns=str.upper) # match column names with 'rank'
      .where(rank <= 80, lambda x: x[rank == 80].max(), axis=1))
 

Выход

           A         B         C         D
0  0.614758  0.075793 -0.181532  0.241273
1  0.446172 -0.243316  0.051767  0.241273
2  0.614758  0.075793 -0.451460 -0.012493