Python 删除json时删除空值

Python 删除json时删除空值,python,json,pandas,Python,Json,Pandas,我有一个熊猫数据框,我想把它保存成json格式。 从熊猫文档中可以看出: 注意NaN、NaT和None将转换为null和datetime 对象将根据日期\格式和日期\单位进行转换 参数 然后使用orient选项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}]' 谢谢以下内

我有一个熊猫数据框,我想把它保存成json格式。 从熊猫文档中可以看出:

注意NaN、NaT和None将转换为null和datetime 对象将根据日期\格式和日期\单位进行转换 参数

然后使用orient选项
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}]'

谢谢

以下内容接近您想要的内容,本质上我们创建了一个非NaN值列表,然后调用
来处理此问题:

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}}'
同时,对
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}}'

我遇到了同样的问题,我的解决方案是使用json模块而不是pd.DataFrame.to_json()

我的解决办法是

  • 将DataFrame转换为dict时删除NaN值,然后
  • 使用json.dumps()将dict转换为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))
    

    上述解决方案实际上不会产生“记录”格式的结果。此解决方案还使用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()])
    

    在写JSON之前,你能不能先
    dropna
    清除空值?@katrielex我认为这比这更复杂,dropna会删除行或列,OP询问是否可以删除单个元素,这样最终的json甚至没有相应的条目element@EdChum是的,你是对的。我能想到的唯一一件事就是为每行生成dirct,在其中可以删除
    NaN
    值,或者解析json dict并去掉条目,我认为dfs不允许表单中每行的维度不同。考虑到这一点,您可以为不包含NaN值的每一行创建一个dict,然后在该列上调用
    to_json
    ,让我试试这个
    df.apply(lambda x:[x.dropna()],axis=1)
    接近您想要的?谢谢,它可以工作,但对于orient options,列标签不会显示,因为它假设您的输入是series类型对不起,您是说
    df.apply(lambda x:[x.dropna()],axis=1)。to_json(orient='columns'))
    不起作用,或者它没有给你想要的输出?它起作用,但是在我将“orient options”设置为“records”的情况下,它没有给你想要的输出是的,这是一个棘手的问题,对此无能为力。正如我所说的,另一件事是对结果dict进行后期处理,并删除嵌套dict中具有空条目的条目,这是一种非常好的方法!这帮助我在一行中将一个高度稀疏的数据透视表变成了一个不支持SQL的插入:)这真是天才。熊猫应该有这个选择。非常感谢。