【问题标题】:Converting a pandas DF to JSON without NAN在没有 NAN 的情况下将 pandas DF 转换为 JSON
【发布时间】:2019-03-01 11:29:25
【问题描述】:

我有一个看起来像这样的 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}]

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

【问题讨论】:

  • 这已经足够接近了:stackoverflow.com/questions/46166112/… -- 我不知道它在 StackOverflow 上是否会被视为重复(我比较新)。
  • 让我提供解决方案并关闭它[dict(zip(x.index.get_level_values(1),x)) for _,x in df.replace('NAN',np.nan).stack().groupby(level=0)]

标签: python json pandas


【解决方案1】:

以下是在字典键值为空时删除字典键的先前答案:

{k: v for k, v in metadata.items() if v is not None}

https://stackoverflow.com/a/12118700/8265971

对于 pandas,有一个 pandas.DataFrame.dropna 函数。如果将这些值分配给列,这将很好地工作: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

【讨论】:

  • @gmuraleekrishna 为什么要删除我的答案并将我的答案替换为我的原始答案?你实际上并没有编辑任何东西。
【解决方案2】:

试试这个:

[{**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`

【讨论】:

  • 好!我希望我会在接下来的答案中看到它(-:
猜你喜欢
  • 2017-04-05
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2020-10-17
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多