Найдите соответствующий интервал столбцов в панд

#python #pandas

Вопрос:

У меня есть фрейм данных pandas с несколькими столбцами, значения которых увеличиваются с некоторого значения от 0 до 1 для столбца A до столбца E , который всегда равен 1 (представляет совокупные вероятности).

 ID          A    B    C    D    E     SIM
1:          0.49 0.64 0.86 0.97 1.00  0.98
2:          0.76 0.84 0.98 0.99 1.00  0.87
3:          0.32 0.56 0.72 0.92 1.00  0.12
 

Столбец SIM представляет собой столбец со случайными однородными числами.

Я хочу добавить новый столбец SIM_CAT со значениями, равными имени столбца, значение которого является правой границей интервала, в который попадает значение в столбце SIM :

 ID          A    B    C    D    E     SIM  SIM_CAT
1:          0.49 0.64 0.86 0.97 1.00  0.98 E
2:          0.76 0.84 0.98 0.99 1.00  0.87 C
3:          0.32 0.56 0.72 0.92 1.00  0.12 A
 

У меня есть краткий способ сделать это?

Ответ №1:

Вы можете сравнить столбцы SIM и использовать idxmax их, чтобы найти 1-е большее значение:

 cols = list('ABCDE')
df['SIM_CAT'] = df[cols].ge(df.SIM, axis=0).idxmax(axis=1)
df
   ID     A     B     C     D    E   SIM SIM_CAT
0  1:  0.49  0.64  0.86  0.97  1.0  0.98       E
1  2:  0.76  0.84  0.98  0.99  1.0  0.87       C
2  3:  0.32  0.56  0.72  0.92  1.0  0.12       A
 

Если SIM может содержать значения, превышающие 1:

 cols = list('ABCDE')
df['SIM_CAT'] = None
df.loc[df.SIM <= 1, 'SIM_CAT'] = df[cols].ge(df.SIM, axis=0).idxmax(axis=1)

df
   ID     A     B     C     D    E   SIM SIM_CAT
0  1:  0.49  0.64  0.86  0.97  1.0  0.98       E
1  2:  0.76  0.84  0.98  0.99  1.0  0.87       C
2  3:  0.32  0.56  0.72  0.92  1.0  0.12       A
 

Комментарии:

1. Если вы замените первую SIM-карту (0,98) на 1,98, idxmax A вместо NaN

2. @Corralien Да, я предполагаю SIM , что между 0 и 1, так как это вероятность. Но, вероятно, лучше явно отметить это.