2016-08-31 11 views
5

У меня есть файл данных pandas DataFrame с двумя столбцами - один с именем файла и часом, в котором он был сгенерирован.Преобразование pandas DataFrame в формат JSON

File  Hour 

    F1   1 
    F1   2 
    F2   1 
    F3   1 

Я пытаюсь преобразовать его в файл JSON в следующем формате:

{“File”:”F1”,”Hour”:”1”} 
{“File”:”F1”,”Hour”:”2”} 
{“File”:”F2”,”Hour”:”1”} 
{“File”:”F3”,”Hour”:”1”} 

Когда я использую команду dataframe.to_json (ориентирует = «записи»), я получаю записи в ниже формат:

[{“File”:”F1”,”Hour”:”1”}, 
{“File”:”F1”,”Hour”:”2”}, 
{“File”:”F2”,”Hour”:”1”}, 
{“File”:”F3”,”Hour”:”1”}] 

Просто интересно, есть ли возможность получить файл JSon в нужном формате. Любая помощь будет оценена по достоинству.

+1

То, что вы хотите, не правильный 'json'. Что вы получаете от 'dataframe.to_json (orient =" records ")' is proper 'json' – piRSquared

ответ

7

Выход, который вы получаете после DF.to_json, является string. Таким образом, вы можете просто отрезать его в соответствии с вашим требованием и удалить из него также запятые.

out = df.to_json(orient='records')[1:-1].replace('},{', '} {') 

Чтобы записать вывод в текстовый файл, вы можете сделать:

with open('file_name.txt', 'w') as f: 
    f.write(out) 
+0

Это удаляет запятые между двумя парами значений: {" ServerGroup ":" Map "" Hour ": 0}. Мне нужно, чтобы это было {«ServerGroup»: «Карта», «Час»: 0}. – user3447653

+0

Да, это была моя ошибка. Попробуйте модифицированный. –

+0

Спасибо, что отлично работает. Сначала я использовал для преобразования данных в json-файл и сохранил его в локальном файле, используя «df1.to_json (orient = 'records», path_or_buf ='/content/tmp/GoogleCount.json ') [1: -1]. replace ('}, {', '} {') ". Но теперь, после оператора replace, я получаю ошибку. Объект «NoneType» не имеет атрибута «__getitem__» « – user3447653

3

Я думаю, что ОП ищет является:

with open('temp.json', 'w') as f: 
    f.write(df.to_json(orient='records', lines=True)) 

Это должно сделать трюк.

0

В новых версиях панды (0.20.0+, я считаю), это может быть сделано непосредственно:

df.to_json('temp.json', orient='records', lines=True) 

Прямое прессование также можно:

df.to_json('temp.json.gz', orient='records', lines=True, compression='gzip') 
Смежные вопросы