我正在循环访问DataFrame中的记录,需要将每一行转换为单独的嵌套JSON

from pprint import pprint
pprint(pd.to_dict())
{'id':{0: 'A'},
'col1':{0: 'B'},
'address_id':{0: ['123','ABC']},
'address_1':{0: ['Street 123','Street ABC']},
'address_2':{0: ['Road 123','Road ABC']},
'city':{0: ['Dallas','Houston']},
'state':{0: ['Texas','Texas']},
'addition_details':{0: ['XYZ','LMP']},
}

REACH记录的预期JSON格式如下,我需要帮助才能转换为所需的输出:

{
  'id': 'A',
  'col1': 'B',
  'address': [{
      'address_id': '123',
      'address_1': 'Street 123',
      'address_2': 'Road 123',
      'city': 'Dallas',
      'state': 'Texas'
    },
    {
      'address_id': 'ABC',
      'address_1': 'Street ABC',
      'address_2': 'Road ABC',
      'city': 'Houston',
      'state': 'Texas'
    }
  ],
  'criteria': [{
      'addition_details': 'XYZ'
    },
    {
      'addition_details': 'LMP'
    },
  ]
}

我try 组合地址字段:

json_output=(pd.groupby(['id','col1'])
              .apply(lambda x: x[['address_id','address_1','address_2','city','state']].to_dist('list'))
              .reset_index(name='address').to_json(orient='records'))
print(json.dumps(json.loads(json_output),index=2, sort_keys=True))

我没有得到所需的输出:

[
{
"id":"A",
"col1":"B",
"address":{
  "address_id":[
[
  '123',
  'ABC'
]],
"address_1":[
[
  'Street 123',
  'Street ABC'
]],
"address_2":[
[
  'Road 123',
  'Road ABC'
]],
....

推荐答案

我不认为这是最干净的方法,但如果您需要快速修复,这个相当手动的方法是可行的:

# Set up the sample DataFrame
data = {'id': {0: 'A'},
        'col1': {0: 'B'},
        'address_id': {0: ['123', 'ABC']},
        'address_1': {0: ['Street 123', 'Street ABC']},
        'address_2': {0: ['Road 123', 'Road ABC']},
        'city': {0: ['Dallas', 'Houston']},
        'state': {0: ['Texas', 'Texas']},
        'addition_details': {0: ['XYZ', 'LMP']}}

df = pd.DataFrame(data)

接下来,我们手动处理转换

# Setup a dictionary and populate it with the easy values.
result = {'id': df.at[0, 'id'],
          'col1': df.at[0, 'col1'],
          'address': [],
          'criteria': []}

# Obtain the address entry:
for i in range(len(df.at[0, 'address_id'])):
    address_entry = {
        'address_id': df.at[0, 'address_id'][i],
        'address_1': df.at[0, 'address_1'][i],
        'address_2': df.at[0, 'address_2'][i],
        'city': df.at[0, 'city'][i],
        'state': df.at[0, 'state'][i]
    }
    result['address'].append(address_entry)


# Obtain the criteria entry:
for i in range(len(df.at[0, 'addition_details'])):
    criteria_entry = {
        'addition_details': df.at[0, 'addition_details'][i]
    }
    result['criteria'].append(criteria_entry)

# Convert the result to JSON
json_output = json.dumps(result, indent=2)
print(json_output)

与您的问题相关的是您原始的DataFrame的 struct .DataFrame struct (每列有多个条目,但只有一行)不常见,通常不推荐使用.根据这段代码的目的以及长期可维护性的目标,您可能需要重新考虑这种 struct . 使用更标准的 struct 化DataFrame,通常也更容易将其转换为其他格式.

Json相关问答推荐

JOLT转换以根据条件删除json对象

使用 JOLT 将日期格式转换为 JSON

Ansible - 将文件内容添加到字典中

json 字符串到 Postgres 14 中的表视图

在 NX 工作区中跨多个应用共享 ngx-translate 翻译文件

如何编写 jolt 规范以将不同的对象转换为数组

jq可以在两个JSON对象列表中依次添加对象吗?

如何加入或合并列表元素列表(未知长度)

如何迭代、动态加载我的表单输入元素,然后在 React 中的表单提交上检索输入值?

Nifi - 忽略(或删除)JSON 的第一个数字

如果 JSON 对象包含列表中的子字符串,则丢弃它们

如何使用 jq 返回此 JSON 文件的文本字段?

杰克逊 2.0 和 Spring 3.1

如何一次加载无限滚动中的所有条目以解析python中的HTML

如何为名称/值 struct 创建 JSON 模式?

使用 JSONObject 在 Java 中为以下 struct 创建嵌套 JSON 对象?

如何将 LinkedTreeMap 转换为 gson JsonObject

如何向从文件中检索的 JSON 数据添加键值?

Microsoft.Net.Http 与 Microsoft.AspNet.WebApi.Client

如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性