【问题标题】:Convert pandas DataFrame to 2-layer nested JSON using groupby使用 groupby 将 pandas DataFrame 转换为 2 层嵌套 JSON
【发布时间】:2020-06-14 02:37:34
【问题描述】:

假设我有一个名为 df 的 pandas 数据框,类似于:

source      tables
src1        table1       
src1        table2          
src1        table3       
src2        table1        
src2        table2 

我目前能够输出一个 JSON 文件,该文件遍历各种源,为每个源创建一个对象,代码如下:

all_data = [] 

    for src in df['source']:
        source_data = {
            src: {
            }
        }
        all_data.append(source_data)

    with open('data.json', 'w') as f:
        json.dump(all_data, f, indent = 2)

这会产生以下输出:

[
  {
    "src1": {}
  },
  {
    "src2": {}
  }
]

本质上,我想做的也是遍历这些源列表并分别添加与每个源对应的表对象。我想要的输出如下所示:

[
  {
    "src1": {
      "table1": {},
      "table2": {},
      "table3": {}
    }
  },
  {
    "src2": {
      "table1": {},
      "table2": {}
    }
  }
]

任何有关如何修改我的代码以遍历表列并将其附加到相应源值的帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: python json pandas dataframe object


    【解决方案1】:

    这就是你要找的吗?

    data = [
        {k: v} 
        for k, v in df.groupby('source')['tables'].agg(
            lambda x: {v: {} for v in x}).items()
    ]
    
    with open('data.json', 'w') as f:
        json.dump(data, f, indent=2)  
    

    这里的答案有两层。要按来源对表格进行分组,请先使用 groupby 并进行内部理解。您可以使用列表推导以这种特定格式整体组装您的数据。

    [
      {
        "src1": {
          "table1": {},
          "table2": {},
          "table3": {}
        }
      },
      {
        "src2": {
          "table1": {},
          "table2": {}
        }
      }
    ]
    

    使用.apply 处理任意数据的示例

    df['tables2'] = 'abc'
    
    def func(g): 
        return {x: y for x, y in zip(g['tables'], g['tables2'])}
    
    data = [{k: v} for k, v in df.groupby('source').apply(func).items()]
    data
    # [{'src1': {'table1': 'abc', 'table2': 'abc', 'table3': 'abc'}},
    #  {'src2': {'table1': 'abc', 'table2': 'abc'}}]
    

    请注意,这不适用于 pandas 1.0(可能是由于错误)

    【讨论】:

    • 是的,这很好用,谢谢!假设我需要更进一步,并在每个相应的表中添加一个列列表(类似于如何将表列表添加到相应的源中),我将如何做到这一点?跨度>
    • 不太确定我是否了解它的工作原理。如果您不介意,您可以将此额外步骤附加到原始答案中吗?真的很有帮助,谢谢
    • @weovibewvoibweoivwoiv pandas 1.0 中有一个错误会阻止此类表达式,您的版本是什么?我添加了一个例子。希望对你有帮助。
    • 我没有 pandas 1.0,所以代码运行良好。但是,输出与我要求的不完全相同。寻找更像[{'src1': {'table1': {'col1':{}, 'col2':{}}, 'table2': {'col1':{}, 'col2':{}, 'col3':{}}}] 的东西,基本上和以前一样,只有 src 和表,但现在还有另一个列层。我们可以把它带到私人消息中吗?
    猜你喜欢
    • 2019-06-09
    • 2014-06-27
    • 1970-01-01
    • 2021-03-07
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-06-15
    相关资源
    最近更新 更多