Основной основной вопрос, но не могу понять это правильно. Я пытаюсь отсортировать по баллам, а затем получить имя, связанное с лучшим баллом.

import pandas as pd
df = pd.DataFrame({'score' :[1,5,7,999], 'name':['jack','jill','chris','kevin']})
df.sort_values(by= 'score', ascending=False, inplace=True)
df
df.name[0]

Однако при таком подходе я получаю Джека вместо Кевина, поскольку, похоже, все происходит в порядке, указанном при создании фрейма данных. Что очевидного я пропускаю?

0
runningbirds 26 Авг 2017 в 00:43

3 ответа

Лучший ответ

Это связано с тем, что при доступе к df.name[0] он указывает на индекс строки (проверьте, вызвав df.index). Значение индекса строки, в которой имя равно jack, равно 0, поскольку при создании df первый экземпляр был jack.

Чтобы получить доступ к первой строке отсортированного df, используйте .iloc для позиционной индексации (или .loc, если вы хотите индексацию на основе меток).

import pandas as pd
df = pd.DataFrame({'score' :[1,5,7,999], 'name':['jack','jill','chris','kevin']})
df.sort_values(by= 'score', ascending=False, inplace=True)
df
df.name.iloc[0]

Это возвращает kevin.

3
Blaszard 25 Авг 2017 в 21:49

Индекс можно реструктурировать с помощью reset_index.

В вашем случае выполнение ниже после того, как sort_values реструктурирует индекс.

df.reset_index(drop=True, inplace=True)
0
shogo2022 25 Авг 2017 в 21:52

Попробуйте это .using idxmax

df.loc[df.score.idxmax(),'name']

Out[5631]: 'kevin'
0
YOBEN_S 25 Авг 2017 в 22:30