Создание нового столбца с именами столбцов в фрейме данных на основе максимального значения двух столбцов

#pandas #python-3.8

Вопрос:

У меня есть фрейм данных следующим образом:

 Col1 Val1 Val2 A 1 0 B 2 3 C 0 4 D 3 2  

Мне нужен следующий вывод:

 Col1 Val1 Val2 Type A 1 0 Val1 B 2 3 Val2 C 0 4 Val2 D 3 2 Val1  

Столбец Type в основном относится к тому, где находится максимум Val1 и. Val2

Я не уверен, как подойти к этому.

Ответ №1:

вы можете сделать это с помощью :

  df['Type'] = df.apply(lambda x: 'Val1' if x.Val1 gt; x.Val2 else 'Val2', axis=1)   

Особый случай : если вы хотите вернуть None, когда Val1 == Val2

  def get_max_col(x):  if x.Val1 gt; x.Val2:  return 'Val1'  elif x.Val1 == x.Val2:  return None  else:  return 'Val2'   df['Type'] = df.apply(get_max_col, axis=1)   

Ответ №2:

(df['Val1'] gt;= df['Val2']).map({True: 'Val1', False: 'Val2'}

 In [43]: df = pd.DataFrame(np.random.randint(0, 20, (10_000, 2)), columns=['val1', 'val2'])  ...: %timeit (df['val1'] gt;= df['val2']).map({True: 'val1', False: 'val2'})  ...: %timeit df.apply(lambda x: 'val1' if x.val1 gt;= x.val2 else 'val2', axis=1)  ...: %timeit df.loc[:, ['val1', 'val2']].idxmax(axis=1) 1.27 ms ± 45.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 123 ms ± 836 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 5.73 ms ± 95.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   

Ответ №3:

Бежать:

 df['Type'] = df.iloc[:, 1:].idxmax(axis=1)  

Этот код работает независимо от количества столбцов и их названий.

iloc[:, 1:] состоит в том, чтобы «отфильтровать» столбец 0.

Если вам нужны только эти 2 столбца, альтернативными вариантами являются:

 df['Type'] = df.iloc[:, 1:3].idxmax(axis=1)  

или

 df['Type'] = df[['Val1', 'Val2']].idxmax(axis=1)  

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

1. Это не сработает, если есть несколько столбцов, и мне нужно сделать выбор только между Val 1 и Val2