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

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 ', кто-то может мне помочь? Большое спасибо.

1
Cecilia 8 Июл 2019 в 14:25

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

Или 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))
3
jezrael 8 Июл 2019 в 11:52

Вот один из подходов с использованием 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
1
yatu 8 Июл 2019 в 11:33

Использование 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
anky_91 8 Июл 2019 в 11:28