如何在Python中添加包含最大列号的对应列名的列?

时间:2019-07-08 11:25:14

标签: python pandas dataframe max data-science

我有一个像这样的数据框:

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',有人可以帮我吗?非常感谢。

3 个答案:

答案 0 :(得分:3)

使用DataFrame.idxmaxDataFrame.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

DataFrame.agg

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_numericerrors='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