Чтение json и запись только определенных объектов json в csv - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть json, где объекты содержат некоторое подмножество надмножества строк, например, «идеальный» случай, когда все строки надмножества включены в объект:

{
  "firstName": "foo",
  "lastName": "bar",
  "age": 20,
  "email":"email@example.com"
        }

Однако некоторыеобъекты выглядят так:

{
  "firstName": "name",
  "age": 40,
  "email":"email@example.com"
        }

Какой оптимальный способ записать объекты с каждой строкой надмножества в CSV-файл?

Если бы это был просто случай строки, имеющейNULL, я думаю, что я бы просто использовал .dropna с пандами, и он бы пропустил эту строку из CSV.

Должен ли я вменять отсутствующие строки, чтобы каждый объект содержал надмножество, но с нулевыми значениями?Если да, то как?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Предположим, у вас есть

json_string ='[{ "firstName": "foo", "lastName": "bar", "age": 20, "email":"email@example.com"}, {"firstName": "name", "age": 40,"email":"email@example.com"}]'

Тогда вы можете

l = json.loads(json_string)
df = pd.DataFrame(l)

Что дает

    age email               firstName   lastName
0   20  email@example.com   foo         bar
1   40  email@example.com   name        NaN

Тогда

>>> df.to_dict('records')

[{'age': 20,
  'email': 'email@example.com',
  'firstName': 'foo',
  'lastName': 'bar'},
 {'age': 40,
  'email': 'email@example.com',
  'firstName': 'name',
  'lastName': nan}]

или

>>> df.to_json()

'{"age":{"0":20,"1":40},"email":{"0":"email@example.com","1":"email@example.com"},"firstName":{"0":"foo","1":"name"},"lastName":{"0":"bar","1":null}}'

Преимущество data frame в том, что вы можете анализировать / манипулировать данными так, как вам хочется, прежде чем снова сделать их словарём / json.

0 голосов
/ 19 сентября 2018

Как вы и предлагали, чтение данных в фрейме панды должно помочь.Использование панд df.read_json() оставит NaN для любого значения, не содержащегося в данной записи json.Так что попробуйте:

a = pd.read_json(json_string, orient='records') 
a.dropna(inplace=True)
a.to_csv(filename,index=False)
0 голосов
/ 19 сентября 2018

Проверьте для всех значений, которые вы хотите:

x = json.loads(json_string)

if 'firstName' in x and 'lastName' in x and 'age' in x and 'email' in x:
    print 'we got all the values'

else
    print 'one or more values are missing'

Или, более красивый способ сделать это:

fields = ['firstName', 'lastName', 'age', 'email']
if all(f in x for f in fields):
    print 'we got all the fields'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...