Получить имена столбцов для значений N Max / Min в строке в Pandas

1

Я пытаюсь получить для каждой отдельной строки имя столбца со значением max/min до N-значений.

Учитывая что-то вроде этого:

a     b     c     d     e
1.2   2     0.1   0.8   0.01
2.1   1.1   3.2   4.6   3.4
0.2   1.9   8.8   0.3   1.3
3.3   7.8   0.12  3.2   1.4

Я могу получить максимум с idxmax(axis=1) и т.д. С min с idxmin(axis=1) но это работает только для top-max и bottom-min, не обобщается для N-значений.

Я хочу получить, если вызывается с N = 2:

a     b     c     d     e     Max1    Max2    Min1    Min2    
1.2   2.0   0.1   0.8   0.1   b       a       c       e
2.1   1.1   3.2   4.6   3.4   d       d       b       a
0.2   1.9   8.8   0.3   1.3   c       b       a       d
3.3   7.8   0.1   3.2   1.4   b       a       c       e

Я знаю, что всегда могу получить данные строки, рассчитать N-е значение и отобразить список имен столбцов по индексу, просто задаваясь вопросом, как лучше, изящнее, если это возможно.

  • 0
    Имеет ли значение порядок имен самых больших и вторых по величине столбцов (и наоборот для самых маленьких)?
  • 0
    В моем случае это не важно. Спасибо за крайний вариант.
Теги:
pandas
max
min

2 ответа

1
Лучший ответ

Вы можете использовать nlargest и nsmallest:

In [11]: res = df.apply(lambda x: pd.Series(np.concatenate([x.nlargest(2).index.values, x.nsmallest(2).index.values])), axis=1)

In [12]: res
Out[12]:
   0  1  2  3
0  b  a  e  c
1  d  e  b  a
2  c  b  a  d
3  b  a  c  e

In [13]: df[["Max1", "Max2", "Min1", "Min2"]] = res

In [14]: df
Out[14]:
     a    b     c    d     e Max1 Max2 Min1 Min2
0  1.2  2.0  0.10  0.8  0.01    b    a    e    c
1  2.1  1.1  3.20  4.6  3.40    d    e    b    a
2  0.2  1.9  8.80  0.3  1.30    c    b    a    d
3  3.3  7.8  0.12  3.2  1.40    b    a    c    e
1

Если порядок наибольшего/наименьшего и второго по величине/наименьшего значения не имеет значения, тогда вы можете использовать np.argpartition.

N = 2 # Number of min/max values 
u = np.argpartition(df, axis=1, kth=N).values
v = df.columns.values[u].reshape(u.shape)

maxdf = pd.DataFrame(v[:,-N:]).rename(columns=lambda x: f'Max{x+1}')
mindf = pd.DataFrame(v[:,:N]).rename(columns=lambda x: f'Min{x+1}')

pd.concat([df, maxdf, mindf], axis=1)

     a    b     c    d     e Max1 Max2 Min1 Min2
0  1.2  2.0  0.10  0.8  0.01    b    a    e    c
1  2.1  1.1  3.20  4.6  3.40    d    e    b    a
2  0.2  1.9  8.80  0.3  1.30    b    c    a    d
3  3.3  7.8  0.12  3.2  1.40    a    b    c    e
  • 0
    Еще один вариант, действительно, спасибо. Просто короткое примечание, v [:, - 2:] и v [:,: 2] должны идти как функция N.
  • 1
    @ RandomGuy42 сделано, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню