Как удалить часть JSON, поврежденную во фрейме данных?

#python #json #pandas #dataframe

#питон #json #панды #фрейм данных

Вопрос:

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

 id | email | phone no | details ------------------------------------------------- 0 10 | abc@g.com | 123 | {"a" : "hello", "b" : {"x": "whatever"....}, "c": "check"} 1 12 | xyz@g.com | 789 | {"a" : "bye", "b" : {"x": "ignore"....}, "c": "cool"}   

В деталях столбца есть ключ под названием — «b», внутри которого находится множество пар значений ключей, и некоторые из них повреждены, потому что отсутствует запятая или инвертированные запятые. Меня это не волнует, потому что мне это не нужно. Могу я просто удалить эту часть JSON, пожалуйста?

Я хочу, чтобы это было так, как показано ниже:

 id | email | phone no | details ------------------------------------------------- 0 10 | abc@g.com | 123 | {"a" : "hello", "c": "check"} 1 12 | xyz@g.com | 789 | {"a" : "bye", "c": "cool"}   

Мне нужно будет подробно описать этот ключ/значение в строках и столбцах для «подробностей», и я смогу это сделать, если удалю этот поврежденный ключ. У меня миллионы записей, поэтому мне нужен способ игнорировать этот ключ для всех строк в столбце «сведения».

Спасибо.

Комментарии:

1. Удалить его будет сложно, так как любой шаблон, которому вы попытаетесь соответствовать, может быть включен в поврежденные данные.

2. Было бы лучше устранить проблему, которая в первую очередь приводит к повреждению JSON.

3. Каков тип значения dtype. Это похоже на диктант, но я полагаю, что это строка, похожая на диктант?

4. Спасибо всем за комментарии, мы попросили исправить JSON, но команда разработчиков не может этого сделать. На самом деле этот новый ключ был недавно введен для какого-то другого использования, которое нам не нужно использовать. Это приводит к сбою моего существующего кода.

5. @Corralien — да, это строка JSON внутри столбца фрейма данных.

Ответ №1:

Попробуйте использовать регулярное выражение с str.replace :

 PAT = re.compile(r',s*"b"s*:s*{.*?}s*,s*') df['details'] = df['details'].str.replace(PAT, ', ') print(df)  # Output:  id email phone no details 0 10 abc@g.com 123 {"a" : "hello", "c": "check"} 1 12 xyz@g.com 789 {"a" : "bye", "c": "cool"}  

Комментарии:

1. @троянская лошадь. Не могли бы вы попробовать мой код в своем фрейме данных, пожалуйста?

2. да, я сейчас пытаюсь это сделать.

3. это действительно так, удалите ключ, который является проблемой, но я все еще вижу ту же ошибку, потому что у остальных ключей все еще, похоже, есть некоторые проблемы с форматированием. Я изучаю эту часть. Может быть, я смогу задать вам больше вопросов, как только проверю несколько вещей. Это снова замечательно. Спасибо! 🙂

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

Ответ №2:

Это грубо и некрасиво, но может сработать, если «b» всегда содержит словарь или, по крайней мере, фигурные скобки, заполненные материалом, который не является закрывающей фигурной скобкой:

 import re import json  # attempt to delete dictionaries associated with "b" key: fixed = [re.sub(r'"b" ?: ?{[^}] }, ?', '', s) for s in df['details']]  try:  # test for valid JSON  [json.loads(f) for f in fixed]  df['details'] = fixed except json.JSONDecodeError:  print('whoops, this ugly hack failed')  

Комментарии:

1. он действительно содержит фигурные скобки и массивы внутри значения для этого ключа — «b».

2. в этом случае будет трудно удалить часть «в», если ее форма не поддается определению. У вас есть спецификация на оставшуюся часть? Например, если вы знаете, что «a» имеет определенную форму и всегда предшествует «b», «c» имеет известную форму и находится после «b», вы можете попробовать обратное совпадение. В противном случае это выглядит неразрешимым.

3. Привет, АббеГийли, шаблон отличается, и в этом случае мы знаем о предыдущих и последующих ключах, однако форма ключа/значений может отличаться. Однако последовательность не будет.