Проблемы с Python с .drop и неуникальным индексом - PullRequest
0 голосов
/ 11 марта 2019

У меня есть пандас DataFrame, скажем df, и я пытаюсь отбросить определенные строки по индексу.В частности:

myindex = df[df.column2 != myvalue].index
df.drop(myindex, inplace = True)

Кажется, что это прекрасно работает для большинства DataFrames, но странные вещи, кажется, происходят с одним DataFrame, где я получаю неуникальный индекс myindex (я не совсем уверен, почему, поскольку DataFrameне имеет повторяющихся строк).Чтобы быть более точным, гораздо больше значений отбрасывается, чем в индексе (в крайнем случае я фактически отбрасываю все строки, даже если есть несколько сотен строк, в которых column2 имеет myvalue).Извлечение только уникальных значений (myindex.unique() и удаление строк с использованием уникального индекса тоже не помогает. В то же время,

df = df[df.column2 != myvalue]

работает так, как мне бы хотелось. Я бы предпочелоднако используйте падение на месте, но что более важно, я хотел бы понять, почему результаты не совпадают с прямым назначением и методом удаления с использованием индекса.

К сожалению, я не могу предоставить данные, поскольку они не могут бытьопубликовано, и так как я не уверен, что именно не так, я не могу имитировать их тоже. Однако я подозреваю, что это, возможно, связано с тем, что myindex является неуникальным (что также смущает меня, так как в df нет повторяющихся строк, новполне возможно, что я неправильно понимаю способ создания индекса).

1 Ответ

0 голосов
/ 11 марта 2019

Если в вашем индексе есть повторяющиеся значения, выполнение reset_index перед может помочь. Это установит ваш текущий индекс в виде столбца и добавит новый последовательный индекс (с уникальными значениями).

df = df.reset_index()

Причина, по которой эти 2 метода не совпадают, заключается в том, что в одном случае вы передаете серию логических значений, представляющих строки, которые нужно сохранить, и какие из них отбрасывать (значения индекса здесь не имеют значения). В случае с пропуском вы передаете список значений индекса (которые отображаются на несколько позиций).

Наконец, чтобы проверить, есть ли в вашем индексе дубликаты, вам не следует проверять наличие дублирующихся строк. Просто сделайте:

df.index.has_duplicates
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...