Как добавить столбец, который содержит имя соответствующего столбца с наибольшим номером в Python? - PullRequest
1 голос
/ 08 июля 2019

У меня есть такой фрейм данных:

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», но дал мне ошибку: операция преобразования «argmax» не разрешена для этого dtype »,Кто-нибудь может мне помочь?Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 08 июля 2019

Используйте 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

Или 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_numeric с errors='coerce' для преобразования проблемных значений нет 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 голос
/ 08 июля 2019

Использование 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
1 голос
/ 08 июля 2019

Вот один из подходов, использующий 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...