在json输出中删除具有空值的列

时间:2018-05-25 13:51:13

标签: python json pandas

我使用pandas函数.to_json将数据从dataframe写入json文件,如下所示:

xx.to_json('file_path',orient='records',lines=True)

输出如下:

{"speed":null,"state":4.0,"stop_trigger":null,"t":1527237121263,"target_speed":null}
{"speed":null,"state":null,"stop_trigger":null,"t":1527237121264,"target_speed":400.0}

如果有空值,如何摆脱输出中的列?:

{"state":4.0,"t":1527237121263}
{"t":1527237121264,"target_speed":400.0}

3 个答案:

答案 0 :(得分:1)

您可以迭代数据框以删除空列并创建字典列表。

然后使用json模块将列表写入文件。

import pandas as pd
import json

df = pd.DataFrame([[np.nan, 4.0, np.nan, 1527237121263, np.nan],
                   [np.nan, np.nan, np.nan, 1527237121264, 400.0]],
                  columns=['speed', 'state', 'stop_trigger', 't', 'target_speed'])

d = [dict(row.dropna()) for idx, row in df.iterrows()]

with open('file.json', 'w') as fp:
    json.dump(d, fp) 

答案 1 :(得分:1)

singledispatch是您的朋友,您可以使用此功能处理不同数据类型中的null / None个案,并使用一个函数(您可以在数据框,dict,文件,或者json string)。

import os
import json
from functools import singledispatch


@singledispatch
def remove_null_bool(ob):
    return ob

@remove_null_bool.register(list)
def _process_list(ob):
    return [remove_null_bool(v) for v in ob if v is not None]

@remove_null_bool.register(dict)
def _process_list(ob):
    return {k: remove_null_bool(v) for k, v in ob.items() if v is not None}



def cleanse(in_file):
    with open(in_file, 'r') as source:
        source_json = json.load(source)
    with open(in_file, 'w') as source:
        json.dump(remove_null_bool(source_json), source)

答案 2 :(得分:1)

最好的方法是检查dict中的每个元素并删除具有null值的键。它看起来像这样。

with open('data.json') as f:
    json_dict = json.load(f)
for key in json_dict:
    if json_dict[key] is Null:
         json_dict.pop(key)

使用json_dict[key]获取密钥的值,使用pop()函数从字典中删除元素。 pop()函数还返回将要删除的键的值。