繁体   English   中英

如何基于 json 文件中的“键”创建 Pandas DF 列?

[英]How to create Pandas DF columns based on "keys" within json file?

我有一个包含以下对象的“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的短语 object 的值从02 这些值中的每一个都有描述它的信息:

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

在名为nBestrecognizedPhrases短语中还有一个 object,其中包含以下信息:

"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 中,当扬声器 = 1 时,列名为“扬声器 1”,当“扬声器 2”时,列名为“扬声器 1” ”。

例如:如果 RecognizedPhrases recognizedPhrases/[0] object 包含"speaker": 1并且 RecognizedPhrases recognizedPhrases/[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:

![5e9cfce03f44bcfe8f6082cbaae6664b.png](:/e17e94b5aff54ba386a03f485bb3218a)

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

我想要得到的是一个 DF,其中所有信息都在一行中。 这是我正在寻找的示例: ![7c416edadf263776eb2f0dfe99e67c07.png](:/ff1745362d5c470c942c927653def6b9)

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

![274da23c5bb1e583c9752513fc5ba713.png](:/9f344824ffb3462e82e7d29aae016921)

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

如果将 JSON object 作为字典分配给变量“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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM