当to_json时,Pandas删除空值

mva*_*mva 14 python json pandas

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

注意NaN,NaT和None将转换为null,datetime对象将根据date_format和date_unit参数进行转换

然后使用orient选项records 我有这样的东西

[{"A":1,"B":4,"C":7},{"A":null,"B":5,"C":null},{"A":3,"B":null,"C":null}]
Run Code Online (Sandbox Code Playgroud)

是否有可能改为:

[{"A":1,"B":4,"C":7},{"B":5},{"A":3}]'
Run Code Online (Sandbox Code Playgroud)

谢谢

Dav*_*rio 10

上面的解决方案实际上并没有以“记录”格式产生结果。此解决方案也使用 json 包,但产生的结果与原始问题中要求的结果完全相同。

import pandas as pd
import json

json.dumps([row.dropna().to_dict() for index,row in df.iterrows()])
Run Code Online (Sandbox Code Playgroud)

此外,如果您想包含索引(并且您使用的是 Python 3.5+),您可以执行以下操作:

json.dumps([{'index':index, **row.dropna().to_dict()} for index,row in df.iterrows()])
Run Code Online (Sandbox Code Playgroud)


EdC*_*ica 6

以下内容接近您想要的,本质上我们创建一个非 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}]}'
Run Code Online (Sandbox Code Playgroud)

此处创建列表是必要的,否则它将尝试将结果与原始 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}}'
Run Code Online (Sandbox Code Playgroud)

还调用 的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}}'
Run Code Online (Sandbox Code Playgroud)