根据两列的最大值在数据框中创建一个包含列名的新列
Creating a new column with column names in dataframe based on maximum value of two columns
我有一个数据框如下:
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
的最大值所在的位置。
我不确定如何处理这个问题。
你可以这样做:
df['Type'] = df.apply(lambda x: 'Val1' if x.Val1 > x.Val2 else 'Val2', axis=1)
特殊情况:如果你想 return None when Val1 == Val2
def get_max_col(x):
if x.Val1 > x.Val2:
return 'Val1'
elif x.Val1 == x.Val2:
return None
else:
return 'Val2'
df['Type'] = df.apply(get_max_col, axis=1)
运行:
df['Type'] = df.iloc[:, 1:].idxmax(axis=1)
无论列数及其名称如何,此代码都有效。
iloc[:, 1:]
是“过滤掉”第 0 列。
如果您只需要这两列仅,备选方案是:
df['Type'] = df.iloc[:, 1:3].idxmax(axis=1)
或
df['Type'] = df[['Val1', 'Val2']].idxmax(axis=1)
(df['Val1'] >= 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'] >= df['val2']).map({True: 'val1', False: 'val2'})
...: %timeit df.apply(lambda x: 'val1' if x.val1 >= 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)
我有一个数据框如下:
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
的最大值所在的位置。
我不确定如何处理这个问题。
你可以这样做:
df['Type'] = df.apply(lambda x: 'Val1' if x.Val1 > x.Val2 else 'Val2', axis=1)
特殊情况:如果你想 return None when Val1 == Val2
def get_max_col(x):
if x.Val1 > x.Val2:
return 'Val1'
elif x.Val1 == x.Val2:
return None
else:
return 'Val2'
df['Type'] = df.apply(get_max_col, axis=1)
运行:
df['Type'] = df.iloc[:, 1:].idxmax(axis=1)
无论列数及其名称如何,此代码都有效。
iloc[:, 1:]
是“过滤掉”第 0 列。
如果您只需要这两列仅,备选方案是:
df['Type'] = df.iloc[:, 1:3].idxmax(axis=1)
或
df['Type'] = df[['Val1', 'Val2']].idxmax(axis=1)
(df['Val1'] >= 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'] >= df['val2']).map({True: 'val1', False: 'val2'})
...: %timeit df.apply(lambda x: 'val1' if x.val1 >= 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)