我有一个像这样的数据框:
A1 A2 A3 ...A99 largest
0 3 4 6 11 11
1 1 8 2 ... 1 8
.
.
.
我使用以下方法创建了包含每行最大值的列:
data['largest']=data.max(axis=1)
但是我还想获得一列,其中包含具有最大数字的相应列名称,如下所示:
A1 A2 A3 ...A99 largest name
0 3 4 6 11 11 A99
1 1 8 2 ... 1 8 A2
. .
. .
. .
我尝试了'.idxmax',但是给了我一个错误'该dtype不允许执行归约运算'argmax',有人可以帮我吗?非常感谢。
答案 0 :(得分:3)
使用DataFrame.idxmax
和DataFrame.assign
来添加2列,而不会互相推论:
df = data.assign(largest=data.max(axis=1), name=data.idxmax(axis=1))
print (df)
A1 A2 A3 A99 largest name
0 3 4 6 11 11 A99
1 1 8 2 1 8 A2
data[['largest','name']] = data.agg(['max','idxmax'], 1)
print (data)
A1 A2 A3 A99 largest name
0 3 4 6 11 11 A99
1 1 8 2 1 8 A2
编辑:
您只能选择数字列:
df1 = data.select_dtypes(np.number)
或将列转换为数字:
df1 = data.astype(int)
如果.astype
无法正常工作,因为可能存在某些非数值,请使用to_numeric
和errors='coerce'
来转换有问题的值no NaN
:
df1 = data.apply(lambda x: pd.to_numeric(x, errors='coerce'))
df = data.assign(largest=df1.max(axis=1), name=df1.idxmax(axis=1))
答案 1 :(得分:1)
这是使用dot
来将列名保留为等于largest
的一种方法:
df['name'] = df.iloc[:,:-1].eq(df.largest.values[:,None]).dot(df.columns[:-1])
A1 A2 A3 A99 largest name
0 3 4 6 11 11 A99
1 1 8 2 1 8 A2
答案 2 :(得分:1)
使用np.argmax()
:
df=df.assign(name=df.columns[np.argmax(df.values,axis=1)])
A1 A2 A3 A99 largest name
0 3 4 6 11 11 A99
1 1 8 2 1 8 A2