Я пытаюсь извлечь поле из json, которое содержит список, а затем добавит этот список в dataframe, но я столкнулся с несколькими различными ошибками.
Я думаю, что могу записать его в csv, а затем прочитать csv с помощью Pandas, но я стараюсь избегать писать какие-либо файлы. Я знаю, что я также могу использовать StringIO для создания csv, но у него есть проблемы с нулевыми байтами. Замена этих будет (я думаю) другим поэтапным шагом, который еще больше продлит время выполнения сценария, чтобы завершить... Я запускаю это против запроса, который возвращает thens тысяч результатов, поэтому сохраняя его быстрым и простым является приоритетом
Сначала я попробовал это:
hit_json = json.loads(hit)
for ln in hit_json.get('hits').get('hits'):
df = df.append(ln['_source'], ignore_index=True)
print(df)
Это дает мне результат, который выглядит так:
1 2 3 4
a b d,e,f... x
Затем я попробовал это:
df = df.append(ln['_source']['payload'], ignore_index=True)
Но это дает мне эту ошибку:
TypeError: cannot concatenate object of type "<class 'str'>"; only pd.Series,
pd.DataFrame, and pd.Panel (deprecated) objs are valid
То, что я ищу, было бы примерно так:
0 1 2 3 4
d e f g h
Вдобавок к этому... Мне нужно выяснить способ обработки определенной строки в этом списке, который содержит запятую... которая может быть головной болью, которая лучше всего обрабатывается в другом вопросе... что-то вроде:
# Obviously this is incorrect but I think you get the idea :)
str.replace(',', '^')
except if ',' followed by ' '
Большое спасибо за любую помощь!
РЕДАКТИРОВАНИЕ ДОБАВЛЕНИЯ JSON КАК ЗАПРОС
{
"_index": "sanitized",
"_type": "sanitized",
"_id": "sanitized".,
"_score": sanitized,
"_source": {
"sanitized": sanitized,
"sanitized": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,\"34,35\",36,37,38,39,40",
"sanitized": "sanitized",
"sanitized": ["sanitized"],
"sanitized": "sanitized",
"sanitized": "sanitized",
"sanitized": "sanitized",
"sanitized": "sanitized",
}
}]
}
}
Вы можете попробовать следующее
hit_json = json.loads(hit)
for ln in hit_json.get('hits').get('hits'):
data = ln['_source']["payload"].split(",")
df.loc[len(df)] = pd.Series(data, index=range(len(data)))
print(df)
Преимущество loc
заключается в том, что вы не будете создавать новую фреймворк каждый раз, так что это будет быстро. Вы можете найти сообщение здесь.
Я также хотел бы предложить альтернативу, которая может быть быстрее. Сначала создайте словарь со всеми данными, а затем выгрузите словарь в фреймворк данных.
Возможно, вы можете написать временный файл с StringIO, как это сделано здесь.
Тогда для второй части вы могли бы сделать
if ',' in data and ', ' not in data:
data = data.replace(',', '^')