【问题标题】:Dict to JSON or Dataframe to JSON export yields no square brackets字典到 JSON 或 Dataframe 到 JSON 导出不产生方括号
【发布时间】:2020-11-24 06:02:08
【问题描述】:

将数据帧转换为 JSON 或从字典转换为 JSON,无论使用 orient 的哪个参数(表或拆分或索引或记录),由于某种原因都没有运气。

代码:

dataf = pd.DataFrame(columns = ["Objects", "Col1", "Col2"])   
dataf['Objects'] = ['Object1','Object2']
dataf['Col1']= ["1","2"]
dataf['Col2']= ["3","4"]

dataf.set_index('Objects', inplace = True)    

# dataf converted to dict 
dataf = dataf.to_dict(orient='index')

我的输出:

dataf
Out[199]: {'Object1': {'Col1': '1', 'Col2': '3'}, 'Object2': {'Col1': '2', 'Col2': '4'}}

其中 'Object1' 和 'Object2' 是键,其对应值是 {'Col1': '1', 'Col2': '3'} 其中 Col1 是键 '1' 是值,Col2 是键 3是价值

outp1 = json.dumps(dataf)

outp1
Out[225]: '{"Object1": {"Col1": "1", "Col2": "3"}, "Object2": {"Col1": "2", "Col2": "4"}}'

所需的输出(已编辑):

{
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      },
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }]
}

如果我输错了正确 JSON 的语法,这里是图片的链接:link 这是我在将其转换为 JSON 时希望得到的格式。

【问题讨论】:

  • 明确地说,您是说作为Object1 的值,您想要一个包含Col1Col2 以及Object3 及其列的字典的列表?
  • 对象 3 来自哪里?
  • 它被称为嵌套字典我会说 Object1 和 Object2 是其中有“列”的主键,并且这些列具有它们的信息或值。我猜输出描述了它?
  • "Expected/Desired output and additional example added (pseudo): "这意味着我只是继续示例输出应该是什么样子。上面的代码和数据框应该是第一个块的输出方式,没有 Object3 等的进一步示例
  • 我仍然不完全确定您的目标是什么,但让我举个例子。假设您要查找Col2Object2 的值。使用 Pandas 的方式,您只需执行 output["Object2"]["Col2"]。按照您尝试的方式,您必须执行output["Object1"][1]["Object2"][0]["Col2"]。你觉得你想要哪一个?

标签: python pandas dictionary


【解决方案1】:

我将介绍几种格式化数据的方法以及它们的用途。

  1. 您最初在问题中要求的内容:
{
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      },
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }]
}

由于我已经在评论中提到的原因,这是 100% 错误的。为了访问Col2Object2,您必须执行output["Object1"][1]["Object2"][0]["Col2"]。这完全没有意义。

2.

{
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      }],
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }
}

这稍微好一点,但仍然不是很有用。现在要访问Col2Object2,您必须执行output["Object2"][0]["Col2"]。中间那个多余的[0]有什么用?没有。

  1. Pandas 给了你什么
{
    'Object1': {
        'Col1': '1',
        'Col2': '3'
    },
    'Object2': {
        'Col1': '2',
        'Col2': '4'
    }
}

这很有用。现在,为了访问Object2 中的Col2,您只需要做output["Object2"]["Col2"]。这是一种完全可以接受的数据组织方式。

  1. 我想你要的是什么
{
    'Objects': [
        {
            'name': 'Object1'
            'Col1': '1',
            'Col2': '3'
        },
        {
            'name' : 'Object2'
            'Col1': '2',
            'Col2': '4'
        }
    ]
}

根据您在 cmets 中的链接,这似乎是您的目标。对象存储在一个列表中,每个列表都有一组键/值对。请注意,我将 ObjectN 从键转换为值。这是因为列表没有键/值对。

  1. 4 的更简单版本
[
    {
        'name': 'Object1'
        'Col1': '1',
        'Col2': '3'
    },
    {
        'name' : 'Object2'
        'Col1': '2',
        'Col2': '4'
    }
]

这与 4 一样有用,但更易于使用。你现在只需要output[1]['Col2'],而不是output['Objects'][1]['Col2']

那么你应该使用哪一个?

这取决于您要如何处理数据。如果您希望能够轻松地遍历对象,那么您需要 4/5。这是因为它们依赖于列表,而迭代正是列表的优势所在。另一方面,如果您主要想查找单个对象的信息而不担心其他对象,那么您需要 3. 字典用于跳转到特定值。

如果您想了解如何将 3 转换为 4 或 5,我建议您再问一个问题或自己尝试一下。不难!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 2013-04-20
    • 2020-06-11
    • 1970-01-01
    • 2021-05-22
    • 2016-05-12
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多