【问题标题】:Nested dictionary to pandas df concatenating rows嵌套字典到 pandas df 连接行
【发布时间】:2021-07-11 19:11:27
【问题描述】:

给定以下字典:

j = {
  "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"
        }
      ]
    }
  ]
}

目标:在df的单行中获取感兴趣的信息。

到目前为止我做了什么?

df = pd.json_normalize(j, record_path=['recognizedPhrases', 'nBest'], meta=['source', 'durationInTicks', 'duration', ['recognizedPhrases', 'speaker']])
df['speech'] = df.groupby(['source', 'recognizedPhrases.speaker'])['display'].transform(lambda x : ' '.join(x))
df = df.drop_duplicates(subset=['recognizedPhrases.speaker'])

获得df

为什么我对得到的输出不满意?:我的输出显示了一个包含两行的 df(每个 recognizedPhrases.speaker 一行),我需要一行中的所有信息,一栏是演讲者 1 所说的内容(在 speaker 栏中),另一栏是 speaker 2 所说的内容。

其他信息:性能是一个重要因素,因为我将处理数千个文件。

编辑 1: 我期望的结果是这样的:

expected_dict = {'source': {0: 'https://example.com'},
 'durationInTicks': {0: 1082400000},
 'duration': {0: 'PT1M48.24S'},
 'recognizedPhrases.speaker1': {0: '¿Gracias por llamar'},
 'recognizedPhrases.speaker2': {0: 'quiero hacer un pago no sé bien la cantidad'}}
expected_df = pd.DataFrame(expected_dict)

【问题讨论】:

  • 请以数据而非图片的形式发布您的预期输出
  • @sammywemmy 感谢您查看我的问题。很难将预期结果作为数据发布,因为我还没有做到这一点。但是我编辑了这个问题,以包含一个理想结果的示例。我手工写了这个结果,我没有以编程方式得到它。

标签: python pandas json-normalize glom


【解决方案1】:

你可以pivot()进入预期输出:

index = ['source', 'durationInTicks', 'duration']
columns = ['recognizedPhrases.speaker']
values= ['speech']

df = df[index+columns+values].pivot(index=index, columns=columns, values=values[0])
df.columns = [f'{df.columns.name}{column}' for column in df.columns]
source durationInTicks duration recognizedPhrases.speaker1 recognizedPhrases.speaker2
https://example.com 1082400000 PT1M48.24S ¿Gracias por llamar quiero hacer un pago no sé bien la cantidad

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2019-03-12
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2022-01-02
    • 2017-12-26
    • 2018-09-24
    • 2022-01-22
    相关资源
    最近更新 更多