Разбор JSON в Пандах

1

Мне нужно извлечь следующий json:

{"PhysicalDisks":[{"Status":"SMART Passed","Name":"/dev/sda"}]}
{"PhysicalDisks":[{"Status":"SMART Passed","Name":"/dev/sda"},{"Status":"SMART Passed","Name":"/dev/sdb"}]}
{"PhysicalDisks":[{"Status":"SMART Passed","Name":"/dev/sda"},{"Status":"SMART Passed","Name":"/dev/sdb"}]}
{"PhysicalDisks":[{"Name":"disk0","Status":"Passed"},{"Name":"disk1","Status":"Passed"}]}
{"PhysicalDisks":[{"Name":"disk0","Status":"Failed"},{"Name":"disk1","Status":"not supported"}]}
{"PhysicalDisks":[{"Name":"disk0","Status":"Passed"}]}

Name: raw_results, dtype: object

В отдельные столбцы. Я не знаю, сколько дисков за результат может быть в будущем. Что было бы лучше всего здесь?

Я попробовал следующее:

d = raw_res['raw_results'].map(json.loads).apply(pd.Series).add_prefix('raw_results.')

Дает мне:

Изображение 174551

Пример вывода может быть чем-то вроде Изображение 174551

Лучше всего было бы добавить каждую проверку диска в качестве дополнительной строки в dataframe с той же проверкой, что и строка, из которой она была извлечена. Так что для 3 дисков в результатах он будет генерировать 3 строки по 1 на диск

ОБНОВИТЬ

Этот код

# This works
dfs = []
def json_to_df(row, json_col):
    json_df = pd.read_json(row[json_col])
    dfs.append(json_df.assign(**row.drop(json_col)))

df['raw_results'].replace("{}", pd.np.nan, inplace=True)
df = df.dropna()
df.apply(json_to_df, axis=1, json_col='raw_results')
df = pd.concat(dfs)
df.head()

Добавляет дополнительную строку для каждого диска (sda, sdb и т.д.) Изображение 174551

Поэтому теперь мне нужно разбить эту колонку на 2: "Статус и имя".

  • 0
    Как будет выглядеть ожидаемый результат?
  • 0
    что-то вроде | sda_passed | sdb_passed | ... [br] | 1 | NaN |
Показать ещё 2 комментария
Теги:
pandas
dataframe

1 ответ

0
Лучший ответ
df1 = df["PhysicalDisks"].apply(pd.Series)
df_final = pd.concat([df, df1], axis = 1).drop('PhysicalDisks', axis = 1)
df_final.head()

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню