当to_json时,Pandas删除空值

时间:2015-06-18 10:22:59

标签: python json pandas

我实际上有一个pandas数据帧,我想将它保存为json格式。 从熊猫文档中可以看出:

  

注意NaN,NaT和None将转换为null和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}]'

谢谢

3 个答案:

答案 0 :(得分:3)

以下内容接近你想要的内容,基本上我们创建了一个非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}}'

答案 1 :(得分:3)

上述解决方案实际上并未在'记录中产生结果。格式。此解决方案还使用了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()])

答案 2 :(得分:0)

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

我的解决方案是

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