rudieduddie
@rudieduddie
Python-dev and student

Как правильно пользоваться индексами pandas?

Здравствуйте, я пытаюсь решить данную задачу. Она достаточно интересна.

Функция должна получать на вход pandas.DataFrame, как на изображении, а на выходе отдавать победителя выборов.

В задании также указано, что стоит использовать функции .idxmax(), .sort_index(), .groupby()
Но я уже несколько часов не могу её решить...

5fb7c713f1110646945366.png

Идея в том, что тот кандидат, за которого проголосовало большинство избирателей забирает полное значение из колонки electors

Насколько я понял, мне нужно:
1. отгруппировать по штатам
2. отсортировать по имени кандидата
3. найти победителя в каждом штате
4. Затем мне как-то нужно получить количество electors умноженное на "победил ли этот кандидат", по логике "все или ничего"

Вот, как мой код выглядит сейчас:
def winner_votes(df_in):
    df = df_in.groupby(['state', 'electors'], sort=False).first()
    df.sort_index(axis=1, inplace=True)
    df['winner'] = df.idxmax(axis=1)
    return df


На выходе получается такой датафрейм:

5fb7c8613ef4a244588845.png

Я не понимаю, как мне добавить к этому датафрейму колонку "score", я бы хотел в ней разместить нечто вроде df[ df.index == df['winner'] ] * df['electors'], но, конечно, такой подход не работает..
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
rudieduddie
@rudieduddie Автор вопроса
Python-dev and student
Решение нашёл с привлечением более опытных коллег :)

def winner_votes(df):
    votes = df.drop(columns=['state']).set_index('electors')
    votes = votes.T.sort_index().idxmax().reset_index()
    votes = votes.groupby(0)['electors'].sum().nlargest(1)
    return (list(votes.index)[0], list(votes.values)[0])
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmshar
Ничего не понял из вопроса, но "победитель" по последней приведенной таблице находиться просто - группируем по "winner" и считаем сумму "electors" в группе. Потом выбираем ту группу (того кандидата) у кого эта сумма максимальна.

Если это не ответ на ваш вопрос - уточняйте , переформулируйте и задавайте конкретный вопрос так, ,что-бы можно было понять, что именно вам не понятно.
Ответ написан
@o5a
Считаем сумму в группировке по найденной колонке с максимальным значением из трех, и от результата берем idxmax. Примерно так
df.groupby(df.iloc[:,2:5].idxmax(axis=1)).sum()['electors'].idxmax()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы