首页 > 解决方案 > 在没有 NAN 的情况下将 pandas DF 转换为 JSON

问题描述

我有一个看起来像这样的 DF:

A    B    C    D    E
1    1    NaN  1    1
NaN  2    3    4    NaN

当我做:

df.to_json(orient='records')

我得到类似的东西

[{"A":1,"B":1,"C":null,"D":1,"E":1},{"A":null,"B":2,"C":3,"D":4,"E":null}]

无论如何让它忽略任何有 NaN 并显示如下内容:

[{"A":1,"B":1,"D":1,"E":1},{"B":2,"C":3,"D":4}]

我可以使用熊猫来做到这一点吗?

标签: pythonjsonpandas

解决方案


尝试这个:

[{**x[i]} for i, x in df.stack().groupby(level=0)]

[{'A': 1.0, 'B': 1.0, 'D': 1.0, 'E': 1.0}, {'B': 2.0, 'C': 3.0, 'D': 4.0}]

如果你想int

[{**x[i]} for i, x in df.stack().map(int).groupby(level=0)]

[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]

int如果他们是,保持黑客的方式int

[{**x[i]} for i, x in df.stack().fillna(0, downcast='infer').groupby(level=0)]

[{'A': 1, 'B': 1, 'D': 1, 'E': 1}, {'B': 2, 'C': 3, 'D': 4}]

解释

#    Series with a
#       MultiIndex       Make a Series and drop nulls
#                ↓       ↓                     ↓ Essentially grouping by `index` of `df`
[{**x[i]} for i, x in df.stack().groupby(level=0)]
# ↑   ↑
# ↑   Slice the MultiIndex with name of the group
# Unpack in a dictionary context with double splat `{**mydict} == mydict`

推荐阅读