Получить конкретную ячейку из датафрейма - PullRequest
2 голосов
/ 29 сентября 2019

Я программирую динамический фрейм данных с игроками, значениями (= пожертвованные деревья), рангом и положением в виде столбцов.Игроки играют в игру и могут самостоятельно устанавливать значения.Чем выше значения, тем выше ранг и положение.В конце игры я хочу показать им только свою позицию, что-то вроде вашей позиции - x из общего числа.

Однако, если я выполняю его в Python, я получаю сообщение об ошибке:

«Ошибка индекса: один позиционный индексатор выходит за пределы» в строке end_Position

df = pd.DataFrame({'Name': names, 'Donated Trees': trees})
df['Rank'] = df['Donated Trees'].rank(method='dense', ascending=False).astype(int)
df['Position'] = df['Rank'].rank(method='min').astype(int)
df.set_index('Rank', inplace=True)
df.sort_values(by="Donated Trees", ascending=False)
end_position = str(df.loc[df['Name'] == self.player.name, 'Position'].iloc[0])

1 Ответ

0 голосов
/ 29 сентября 2019

Итак, сообщение об ошибке, которое вы поделились, - это сообщение об ошибке, которое вы получите, когда self.player.name не появится в столбце «Имя».

Тем не менее, я думаю, что вы допустили ошибку проектирования здесь.Вы устанавливаете «Ранг» в качестве индекса.В идеале вы используете индекс в качестве уникального поля, которое позволяет быстро получать интересующие строки.Поскольку «Ранг» не является уникальным, и вы также не используете функцию быстрого поиска, я бы не советовал.Вместо этого вы должны сделать «Имя» индекс.Вы уже используете его дважды для поиска, и он, скорее всего, будет уникальным.(Лучше всего как-то убедиться, но в своем коде вы уже предполагаете, что «Имя» уникально.) Таким образом, вы повысили эффективность своего кода, удобочитаемость, и вы получите более понятный KeyError: "Bob" с «Бобом».ключ не в вашем фрейме данных.

df = pd.DataFrame({'Name': names, 'Donated Trees': trees})
df['Rank'] = df['Donated Trees'].rank(method='dense', ascending=False).astype(int)
df['Position'] = df['Rank'].rank(method='min').astype(int)
df.set_index('Name', inplace=True)
df.sort_values(by="Donated Trees", ascending=False)
print(" ".join(["Your current position is", str(df.loc["Sam", 'Position']), "of", str(len(df))]))
end_position = str(df.loc[self.player.name, 'Position'])
...