2015-06-18 2 views
7

У меня есть реальный кадр данных pandas, и я хочу сохранить его в формате json. С пандами DOCS он говорит:Pandas удаляет пустые значения, когда to_json

Примечание Нэн, Ната и никто не будет преобразован в нуль и DateTime объекты будут преобразованы на основе date_format и date_unit параметры

Затем с помощью опции ориентировать records у меня есть что-то вроде этого

[{"A":1,"B":4,"C":7},{"A":null,"B":5,"C":null},{"A":3,"B":null,"C":null}] 

можно ли иметь вместо этого:

[{"A":1,"B":4,"C":7},{"B":5},{"A":3}]' 

Спасибо

+0

Вы можете просто 'dropna' в аннулирует перед записью JSON? – katrielalex

+1

@katrielalex Я думаю, что это сложнее, Dropna удалит строки или столбцы, OP спрашивает, можно ли удалить отдельные элементы, чтобы последний json даже не имел записи для этого элемента. – EdChum

+0

@EdChum да, вы правы – mva

ответ

2

Следующая приближается к тому, что вы хотите, по сути, мы создаем список значений, не NaN, а затем вызвать to_json по этому вопросу:

In [136]: 
df.apply(lambda x: [x.dropna()], axis=1).to_json() 

Out[136]: 
'{"0":[{"a":1.0,"b":4.0,"c":7.0}],"1":[{"b":5.0}],"2":[{"a":3.0}]}' 

создание списка является необходимо здесь, иначе он попытается выровнять результат с вашей исходной формой df, и это приведет к повторному введению значений NaN, которых вы хотите избежать:

In [138]: 
df.apply(lambda x: pd.Series(x.dropna()), axis=1).to_json() 

Out[138]: 
'{"a":{"0":1.0,"1":null,"2":3.0},"b":{"0":4.0,"1":5.0,"2":null},"c":{"0":7.0,"1":null,"2":null}}' 

также призывает list на результат dropna будет транслировать результат с формой, как заполнение:

In [137]: 
df.apply(lambda x: list(x.dropna()), axis=1).to_json() 

Out[137]: 
'{"a":{"0":1.0,"1":5.0,"2":3.0},"b":{"0":4.0,"1":5.0,"2":3.0},"c":{"0":7.0,"1":5.0,"2":3.0}}' 
+0

благодарю вас за это, но для ссылок с ориентацией столбцы ярлыки не отображаются, потому что предполагается, что ваш вход является серийным. – mva

+0

Извините, вы говорите 'df.apply (lambda x: [x.dropna()], axis = 1). to_json (orient = 'columns') 'не работает или не дает вам желаемого результата? – EdChum

+0

он работает, но он не дает желаемого результата для случая, когда я устанавливаю параметры ориентации для «записей» – mva

0

У меня такая же проблема, и мое решение использовать JSon модуль вместо pd.DataFrame. to_json()

Мое решение

  1. уронить значение NaN когда Conver тин DataFrame к Сыроватского, а затем
  2. новообращенный ДИКТ в JSon используя json.dumps()

Вот код:

import pandas as pd 
import json 
from pandas import compat 

def to_dict_dropna(df): 
    return {int(k): v.dropna().astype(int).to_dict() for k, v in compat.iteritems(df)} 

json.dumps(to_dict_dropna(df)) 
0

Раствор выше фактически не дают результаты в ' формат записей. Это решение также использует пакет json, но дает точно результат, заданный в исходном вопросе.

import pandas as pd 
import json 

json.dumps([row.dropna().to_dict() for index,row in df.iterrows()]) 

Кроме того, если вы хотите включить индекс (и вы на Python 3.5+), вы можете сделать:

json.dumps([{'index':index, **row.dropna().to_dict()} for index,row in df.iterrows()]) 
Смежные вопросы