【问题标题】:How to create Pandas DF columns based on "keys" within json file?如何根据 json 文件中的“键”创建 Pandas DF 列?
【发布时间】:2021-04-14 21:29:09
【问题描述】:

我有一个包含以下对象的“json 文件”: combinedRecognizedPhrases recognizedPhrases
json 示例:

{
  "source": "https://example.com",
  "timestamp": "2021-04-12T19:34:24Z",
  "durationInTicks": 1082400000,
  "duration": "PT1M48.24S",
  "combinedRecognizedPhrases": [
    {
      "channel": 0,
      "lexical": "aaa",
      "itn": "aaa",
      "maskedITN": "aaa",
      "display": "aaa"
    }
  ],
  "recognizedPhrases": [
    {
      "recognitionStatus": "Success",
      "channel": 0,
      "speaker": 1,
      "offset": "PT2.18S",
      "duration": "PT3.88S",
      "offsetInTicks": 21800000,
      "durationInTicks": 38800000,
      "nBest": [
        {
          "confidence": 0.9306252,
          "lexical": "gracias por llamar",
          "itn": "gracias por llamar",
          "maskedITN": "gracias por llamar",
          "display": "¿Gracias por llamar",
          "words": [
            {
              "word": "gracias",
              "offset": "PT2.18S",
              "duration": "PT0.37S",
              "offsetInTicks": 21800000,
              "durationInTicks": 3700000,
              "confidence": 0.930625
            },
            {
              "word": "por",
              "offset": "PT2.55S",
              "duration": "PT0.18S",
              "offsetInTicks": 25500000,
              "durationInTicks": 1800000,
              "confidence": 0.930625
            },
            {
              "word": "llamar",
              "offset": "PT2.73S",
              "duration": "PT0.22S",
              "offsetInTicks": 27300000,
              "durationInTicks": 2200000,
              "confidence": 0.930625
            }
          ]
        }
      ]
    },
    {
      "recognitionStatus": "Success",
      "channel": 0,
      "speaker": 2,
      "offset": "PT6.85S",
      "duration": "PT5.63S",
      "offsetInTicks": 68500000,
      "durationInTicks": 56300000,
      "nBest": [
        {
          "confidence": 0.9306253,
          "lexical": "quiero hacer un pago",
          "itn": "quiero hacer un pago",
          "maskedITN": "quiero hacer un pago",
          "display": "quiero hacer un pago"
        }
      ]
    },
    {
      "recognitionStatus": "Success",
      "channel": 0,
      "speaker": 2,
      "offset": "PT13.29S",
      "duration": "PT3.81S",
      "offsetInTicks": 132900000,
      "durationInTicks": 38100000,
      "nBest": [
        {
          "confidence": 0.93062526,
          "lexical": "no sé bien la cantidad",
          "itn": "no sé bien la cantidad",
          "maskedITN": "no sé bien la cantidad",
          "display": "no sé bien la cantidad"
        }
      ]
    }
  ]
}

在示例中,recognizedPhrases 对象的值从 02。这些值中的每一个都有描述它的信息:

"recognitionStatus": "Success",
      "channel": 0,
      "speaker": 1,
      "offset": "PT2.18S",
      "duration": "PT3.88S",
      "offsetInTicks": 21800000,
      "durationInTicks": 38800000

recognizedPhrases 内部还有一个名为nBest 的对象,其中包含以下信息:

"confidence": 0.9306252,
          "lexical": "thank you for calling",
          "itn": "thank you for calling",
          "maskedITN": "thank you for calling",
          "display": "thank you for calling".

我需要整理每个recognizedPhrases/[0]12 等中的可用信息。/nBest/[1]/display 在一个DF 中,当speaker=1 时有一列名为“speaker 1”,当“speaker 2”时有一列”。

例如:如果 recognizedPhrases/[0] 对象包含 "speaker": 1recognizedPhrases/[1] 也有 "speaker": 1 这些短语应该在我的 df 的扬声器 1 列中连接。

编辑 1: 我已经尝试了以下方法:

with open('file.json','r') as f:
    j = json.load(f)    
test = pd.json_normalize(j, record_path=['recognizedPhrases'], meta=['source', 'durationInTicks', 'duration'], record_prefix='_')

这给了我以下 DF:

这个 DF 的问题在于,每个发言者每次说话时它都有一行。在我使用的示例中,speaker1 说一次,speaker 2 说两次,这段代码会生成 3 行,这不是我想要的。此外,每个说话者所说的内容都在 _nBest 字典中,并且需要额外的代码才能得到所说的内容。

我想要得到的是一个 DF,其中所有信息都在一行中。这是我正在寻找的示例:

评论@DSteman 回答: 这种方法有一件好事,那就是它允许我将扬声器分开。但是,有两点我需要改进。 首先,这种方法创建了两行。我需要将所有信息排成一行。 第二,在speaker 1栏中有speaker 2所说的内容。

第三,这种方法遗漏了很多必要的信息(见上面我正在寻找的输出图片)。

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    如果将 JSON 对象作为 dict 分配给变量“x”,则下面会生成一个 df,其中列是说话者,行是短语。

    speakers = [i.get('speaker') for i in x.get('recognizedPhrases')]
    phrases = [i.get('nBest')[0].get('display') for i in x.get('recognizedPhrases')]
    columns = list(set(speakers))
    data = [[x[1] for x in zip(speakers, phrases) if x[0] == i] for i in columns]
    df = pd.DataFrame(data, columns=columns)
    

    【讨论】:

    • 非常感谢您的回复。我编辑了原始问题以解释为什么您的答案没有提供我正在寻找的结果。
    猜你喜欢
    • 2021-09-19
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多