【问题标题】:Mapping pandas df to JSON Schema将 pandas df 映射到 JSON Schema
【发布时间】:2021-09-27 21:23:12
【问题描述】:

这是我的 df:

text date channel sentiment product segment
0 I like the new layout 2021-08-30T18:15:22Z Snowflake predict Skills EMEA

我需要将其转换为与以下内容匹配的 JSON 输出:

[
  {
    "text": "I like the new layout",
    "date": "2021-08-30T18:15:22Z",
    "channel": "Snowflake",
    "sentiment": "predict",
    "fields": [
      {
        "field": "product",
        "value": "Skills"
      },
      {
        "field": "segment",
        "value": "EMEA"
      }
    ]
  }
]

我无法将列的键映射到第一个字典中的值,并将列和行映射到最终字典中的新键。我已经尝试了使用 df.groupby.apply() 的各种选项,但我做不到。

我尝试过的示例:

df.groupby(['text', 'date','channel','sentiment','product','segment']).apply(
     lambda r: r[['27cf2f]].to_dict(orient='records')).unstack('text').apply(lambda s: [
{s.index.name: idx, 'fields': value}
for idx, value in s.items()]
).to_json(orient='records')

感谢所有帮助!

【问题讨论】:

  • 我相信您给定的 df 缺少某些列。此外,您可能希望在表格之前添加一行,否则无法正确显示。
  • @Cookie df 是正确的。感谢您对降价的反馈。

标签: python json pandas


【解决方案1】:

一种选择是使用嵌套列表推导:

# Start with your example data
d = {'text': ['I like the new layout'],
     'date': ['2021-08-30T18:15:22Z'],
     'channel': ['Snowflake'],
     'sentiment': ['predict'],
     'product': ['Skills'],
     'segment': ['EMEA']}

df = pd.DataFrame(d)

# Specify field column names
fieldcols = ['product', 'segment']

# Build a dict for each group as a Series named `fields`
res = (df.groupby(['text', 'date','channel','sentiment'])
 .apply(lambda s: [{'field': field, 
                    'value': value}
                   for field in fieldcols
                   for value in s[field].values])
).rename('fields')

# Convert Series to DataFrame and then to_json
res = res.reset_index().to_json(orient='records')

# Print result
import json
print(json.dumps(json.loads(res), indent=2))

[
  {
    "text": "I like the new layout",
    "date": "2021-08-30T18:15:22Z",
    "channel": "Snowflake",
    "sentiment": "predict",
    "fields": [
      {
        "field": "product",
        "value": "Skills"
      },
      {
        "field": "segment",
        "value": "EMEA"
      }
    ]
  }
]

【讨论】:

  • 谢谢彼得!这完美地工作。标记为已接受!接下来,如果您需要在 fields 数组中有多个列,您将如何执行此操作?
  • 谢谢马修!您的意思是如何扩展它以处理名称为27cf2f 的多个附加列?我会尝试使用第二个列表或字典理解来遍历字段 ID 列,或者可能是 pd.melt 首先将字段 ID 从列名移动到单个列中,并将字段值移动到它们自己的列中。
  • 嘿彼得。对,那是正确的。我已经更新了问题以反映所需的逻辑,因为我正在努力为附加列编写代码。谢谢!
  • 知道了。我已经编辑了我的答案以处理多个字段列。希望这行得通!
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2017-04-05
  • 2016-06-04
  • 2020-08-15
  • 1970-01-01
  • 2018-09-24
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多