Существует ли стандартный способ исправления пропущенных значений в столбце индекса pandas?

#python #pandas #dataframe

Вопрос:

Проблема

Я работаю с набором данных, который был предоставлен мне в виде csv-файла со строками формы id,data . Я хотел бы работать с этими данными в фрейме данных pandas с идентификатором в качестве индекса.

К сожалению, где-то в конвейере данных в моих csv-файлах есть несколько строк, в которых отсутствуют идентификаторы. К счастью, строки моих данных не полностью независимы, поэтому я могу воссоздать недостающие значения: каждая строка связана со своей предшественницей, и у меня есть доступ к оракулу, который, получив идентификатор, может предоставить мне все свои данные. Это включает в себя идентификатор его предшественника.

Поэтому мой вопрос заключается в том, существует ли простой способ заполнения этих недостающих значений в моем фрейме данных

Мое решение

У меня нет большого опыта работы с пандами, но, поиграв немного, я пришел к следующему подходу. Я начинаю с чтения csv-файла во фрейм данных без установки индекса, поэтому в итоге получаю RangeIndex. Я тогда

  1. Найдите расположение строк с отсутствующими идентификаторами
  2. Добавьте 1 к индексу, чтобы получить дочерние элементы каждой строки
  3. Спросите оракула о родителях каждого ребенка
  4. Объедините родителей и детей в идентификаторе ребенка
  5. Снова вычтите один из индекса и установите родительские идентификаторы

В коде:

 children = df.loc[df[df['id'].isna()].index   1, 'id']
parents = pd.Series({x.id: x.parent_id for x in ask_oracle(children)},
                    name='parent_id')

combined = pd.merge(children, parents, left_on='id', right_index=True)
combined.set_index(combined.index - 1, inplace=True)
df.loc[combined.index, 'id'] = combined['parent_id']
 

Это работает, но я на 95% уверен, что через несколько месяцев это будет выглядеть как страшная черная магия.

В частности, я недоволен

  • То, как я получаю расположение строк nan. Три партии df[ в одной строке-это просто слишком много
  • Руководство, возящееся с индексами, которые я должен сделать, чтобы строки совпали.

У кого-нибудь есть какие-либо предложения по лучшему способу ведения дел?

Формат входных данных фиксирован, как и свойства oracle, но если есть более разумный способ организации моего фрейма данных, я более чем рад это услышать.