#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