2015-06-18 17 views
7

Ich habe eigentlich einen Pandas-Datenframe und ich möchte es in JSON-Format speichern. Von den Pandas docs heißt es:Pandas entfernen Nullwerte, wenn to_json

Hinweis Nans wird Nats und None konvertiert werden auf null und Datumzeit Objekte konvertiert auf der date_format basieren und date_unit Parameter

dann mit dem orient Option records ich habe so etwas wie diese

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

Ist es möglich, diese stattdessen zu haben:

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

Danke

+0

Können Sie nur 'dropna' die Nullen vor dem JSON zu schreiben? – katrielalex

+1

@katrielalex Ich denke, es ist komplizierter als das, dropna wird Zeilen oder Spalten entfernen, das OP fragt, ob es möglich ist, einzelne Elemente zu entfernen, so dass der letzte Json nicht einmal einen Eintrag für dieses Element hat – EdChum

+0

@EdChum ja du hast Recht – mva

Antwort

2

Im folgenden wird nah an, was Sie wollen, im Wesentlichen wir eine Liste der nicht-NaN-Werte erstellen und dann to_json auf diesem Aufruf:

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}]}' 

Erstellen einer Liste ist notwendig hier sonst wird es versuchen, das Ergebnis mit Ihrer ursprünglichen df Form auszurichten und dies wird die NaN Werte wieder einführen, die was Sie vermeiden möchten:

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}}' 

auch list auf dem Ergebnis der dropna Aufruf wird das Ergebnis mit der Form ausgestrahlt, wie Füllung:

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

danke es funktioniert, aber für orient Optionen Spaltenbeschriftungen nicht angezeigt, weil es Ihre Eingabe angenommen wird Serie sind – mva

+0

Sorry sagen Sie 'df.apply (Lambda x: [x.dropna()], Achse = 1). to_json (orient = 'columns') 'funktioniert nicht oder gibt es nicht die gewünschte Ausgabe? – EdChum

+0

es funktioniert, aber es gibt nicht die gewünschte Ausgabe für den Fall, wenn ich orientieren Optionen auf "Datensätze" – mva

0

Ich habe das gleiche Problem und meine Lösung ist json Modul statt pd.DataFrame verwenden. to_json()

Meine Lösung ist

  1. den NaN Wert fallen, wenn conver ting Datenrahmen dict, und dann
  2. convert dict()

Hier ist der Code JSon json.dumps mit:

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

Die Lösung oben eigentlich nicht produzieren Ergebnisse in der ' Format der Datensätze. Diese Lösung verwendet ebenfalls das json-Paket, erzeugt aber genau das Ergebnis, das in der ursprünglichen Frage gefordert wurde.

import pandas as pd 
import json 

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

Außerdem, wenn Sie den Index aufgenommen werden sollen (und Sie sind auf Python 3.5 oder höher), die Sie tun können:

json.dumps([{'index':index, **row.dropna().to_dict()} for index,row in df.iterrows()]) 
Verwandte Themen