Применить pd.Series.nlargest
к каждому столбцу, чтобы замаскировать все, кроме верхних N значений.Затем unstack
и удалите NaN
.Я буду использовать верхние 2 значения здесь для иллюстрации.
Пример данных
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame(np.random.normal(0, 10, (4, 3)),
columns=['Date1', 'Date2', 'Date3'],
index=['Stock1', 'Stock2', 'Stock3', 'Stock4'])
# Date1 Date2 Date3
#Stock1 4.967142 -1.382643 6.476885
#Stock2 15.230299 -2.341534 -2.341370
#Stock3 15.792128 7.674347 -4.694744
#Stock4 5.425600 -4.634177 -4.657298
Код
df.apply(pd.Series.nlargest, n=2).unstack().dropna()
#Date1 Stock2 15.230299
# Stock3 15.792128
#Date2 Stock1 -1.382643
# Stock3 7.674347
#Date3 Stock1 6.476885
# Stock2 -2.341370
#dtype: float64