Извлечение списка из списка списков и добавление к фрейму данных

1

Я пытаюсь извлечь поле из 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",
}
}]
}
}
Теги:
pandas
list
dictionary

2 ответа

0

Вы можете попробовать следующее

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 заключается в том, что вы не будете создавать новую фреймворк каждый раз, так что это будет быстро. Вы можете найти сообщение здесь.

Я также хотел бы предложить альтернативу, которая может быть быстрее. Сначала создайте словарь со всеми данными, а затем выгрузите словарь в фреймворк данных.

0

Возможно, вы можете написать временный файл с StringIO, как это сделано здесь.

Тогда для второй части вы могли бы сделать

if ',' in data and ', ' not in data:
    data = data.replace(',', '^')
  • 0
    Я также попробовал это ... это медленно и имеет проблемы с нулевыми байтами, если есть нулевой байт, он просто полностью терпит неудачу. Решением этой проблемы будет замена нулевых байтов, но это еще один шаг, который идет строка за строкой. Это определенно возможное решение, хотя я надеюсь, что смогу заставить его работать без StringIO

Ещё вопросы

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