2015-06-18 11 views
7

मेरे पास वास्तव में एक पांडा डेटाफ्रेम है और मैं इसे जेसन प्रारूप में सहेजना चाहता हूं। पांडा के डॉक्स यह कहते हैं:पांडस शून्य मान हटाते हैं जब to_json

नोट NaN की, नेट की और कोई भी शून्य पर और 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

तुम सिर्फ 'JSON लिखने से पहले nulls dropna' कर सकते हैं? – katrielalex

+1

@ katrielalex मुझे लगता है कि इससे अधिक जटिल है, ड्रॉपना पंक्तियों या स्तंभों को हटा देगी, ओपी पूछ रहा है कि एकल तत्वों को निकालना संभव है, इसलिए अंतिम जेसन में उस तत्व के लिए कोई प्रविष्टि भी नहीं है – 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}]}' 

एक सूची पैदा कर रही है यहां जरूरी है अन्यथा यह परिणाम को आपके मूल डीएफ आकार के साथ संरेखित करने का प्रयास करेगा और यह 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}}' 

भी dropna के परिणाम पर list बुला आकार के साथ परिणाम का प्रसारण किया जाएगा भरने की तरह,:

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 = 'कॉलम') 'काम नहीं करता है या यह आपको वांछित आउटपुट नहीं देता है? – EdChum

+0

यह काम करता है लेकिन यह मामले के लिए वांछित आउटपुट नहीं देता है जब मैं "रिकॉर्ड" – mva

0

मैं एक ही समस्या हो गया और मेरी समाधान का उपयोग json बजाय मॉड्यूल pd.DataFrame है। to_json()

मेरे समाधान है

  1. ड्रॉप NaN मूल्य जब बातचीत टिंग DataFrame dict, और फिर
  2. परिवर्तित dict json.dumps का उपयोग कर JSON करने के लिए()

यहाँ कोड है:

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

समाधान ऊपर वास्तव में परिणाम में उत्पादन नहीं करता है ' रिकॉर्ड 'प्रारूप। यह समाधान जेसन पैकेज का भी उपयोग करता है, लेकिन मूल प्रश्न में वास्तव में परिणाम के लिए पूछताछ करता है।

import pandas as pd 
import json 

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

साथ ही, आपको सूचकांक शामिल करना चाहते हैं (और आप अजगर पर हैं 3.5+) आप कर सकते हैं यदि:

json.dumps([{'index':index, **row.dropna().to_dict()} for index,row in df.iterrows()]) 
संबंधित मुद्दे