#python #pandas #dataframe
Вопрос:
Проблема
Я работаю с набором данных, который был предоставлен мне в виде csv-файла со строками формы id,data
. Я хотел бы работать с этими данными в фрейме данных pandas с идентификатором в качестве индекса.
К сожалению, где-то в конвейере данных в моих csv-файлах есть несколько строк, в которых отсутствуют идентификаторы. К счастью, строки моих данных не полностью независимы, поэтому я могу воссоздать недостающие значения: каждая строка связана со своей предшественницей, и у меня есть доступ к оракулу, который, получив идентификатор, может предоставить мне все свои данные. Это включает в себя идентификатор его предшественника.
Поэтому мой вопрос заключается в том, существует ли простой способ заполнения этих недостающих значений в моем фрейме данных
Мое решение
У меня нет большого опыта работы с пандами, но, поиграв немного, я пришел к следующему подходу. Я начинаю с чтения csv-файла во фрейм данных без установки индекса, поэтому в итоге получаю RangeIndex. Я тогда
- Найдите расположение строк с отсутствующими идентификаторами
- Добавьте 1 к индексу, чтобы получить дочерние элементы каждой строки
- Спросите оракула о родителях каждого ребенка
- Объедините родителей и детей в идентификаторе ребенка
- Снова вычтите один из индекса и установите родительские идентификаторы
В коде:
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, но если есть более разумный способ организации моего фрейма данных, я более чем рад это услышать.