Странное несоответствие между df.drop () и df.idxmin () - PullRequest
1 голос
/ 01 апреля 2020

У меня странная проблема с pandas. После некоторой тщательной отладки я обнаружил проблему, но мне хотелось бы исправить ее и объяснить, почему это происходит.

У меня есть датафрейм, который состоит из списка городов с некоторыми расстояниями. Мне нужно итеративно находить город, который ближе всего расположен к какому-то «семенному» городу (здесь детали не слишком важны).

Чтобы найти «ближайший» город к моему начальному городу, я использую:

id_new_point = df["Time from seed"].idxmin(skipna=True)

Затем я хочу удалить только что найденный город из кадра данных, для которого я использую:

df.drop(index=emte_df.index[id_new_point], inplace=True)

Теперь начинается странная часть; Я подключил отладчик pycharm и внимательно наблюдал за моим фреймом данных, проходя через циклы.

Когда вы удаляете строку в pandas с помощью df.drop, кажется, удаляется вся строка по номеру строки . Например, это означает, что если я удаляю строку № 126, «столбец индекса» информационного кадра не адаптируется соответствующим образом. (См. Скриншот ниже)

enter image description here

idxmin, кажется, возвращает фактический индекс строки, поэтому индекс, связанный с строка во фрейме pandas.

Теперь возникает проблема: скажем, я хочу удалить строку 130 (EMTE WIJCHEN). Я бы использовал df.idxmin, что дало бы мне index , а именно 130. Затем я вызываю df.drop[index], но поскольку df.drop использует для удаления номера строк вместо индексов фрейма данных и Я только что удалил строку (# 126), теперь она (ошибочно) удаляет строку # 131, которая переместилась на место 130.

Почему это происходит, и как я могу улучшить свой код, чтобы я мог отбросить нужные строки в моем фрейме данных? Любые предложения приветствуются (также, если есть лучшая практика для решения таких проблем, может быть, решение, которое не адаптирует базу данных на месте?)

1 Ответ

1 голос
/ 01 апреля 2020

Pandas не обновлять индексный столбец, потому что это не всегда диапазон чисел, это могут быть, например, имена (Джон, Мария и др. c), и, следовательно, не имеет смысла «обновить» индекс после удаления указанной строки c. Вы можете сбросить индекс после каждой итерации следующим образом:

df.drop(index=emte_df.index[id_new_point], inplace=True)
df = df.reset_index(drop=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...