[英]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 的值从0
到2
。 这些值中的每一个都有描述它的信息:
"recognitionStatus": "Success",
"channel": 0,
"speaker": 1,
"offset": "PT2.18S",
"duration": "PT3.88S",
"offsetInTicks": 21800000,
"durationInTicks": 38800000
在名为nBest
的recognizedPhrases
短语中还有一个 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]
或1
或2
等中可用的信息。 /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:
这个 DF 的问题在于,每个说话者每次说话时它都有一行。 在我使用的示例中,speaker1 说一次,speaker 2 说两次,这段代码会生成 3 行,这不是我想要的。 此外,每个说话者所说的内容都在_nBest
字典中,并且需要额外的代码来获取所说的内容。
我想要得到的是一个 DF,其中所有信息都在一行中。 这是我正在寻找的示例:
评论@DSteman 答案:这种方法做了一件好事,那就是它允许我将发言者分开。 但是,有两点我需要改进。 首先,这种方法创建了两行。 我需要将所有信息排成一行。 其次,在扬声器 1 栏中有扬声器 2 所说的内容。
第三,这种方法遗漏了很多必要的信息(见上面我正在寻找的 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.