当数据嵌套且模式不规则时,将字典列表转换为数据帧

2024-05-31 23:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个用于文字词典的API来浏览单词列表,并创建单词定义和单词来源的数据框架。我的最终目标是查看列表中有多少单词来自拉丁语、希腊语、古英语等

问题是,有些词有多个定义,这些定义嵌套在数据中。例如,“tart”有三个定义,这意味着如果您在API中查询“tart”,您将得到三个字典的列表,并且定义嵌套在这些字典中。按照我现在编写代码的方式,它只包括列表中的最后一个定义

我希望数据帧具有以下任一项: a) 每个单词一行,然后是“定义1”、“定义2”、“单词来源1”、“单词来源2”等列,或 b) 每个定义一行,所以“tart”应该是三行

但是我不知道如何在不创建非常混乱和复杂的代码的情况下做到这一点,代码涉及for循环中的for循环,for循环中的for循环,等等

这是我的密码:

wordlist = ['illicitly', 'tray', 'tali', 'tart', 'itty']

rows = []

for word in wordlist:
    row = {}
    row['word'] = word
    print(word)
    url = "https://api.dictionaryapi.dev/api/v2/entries/en/"+word
#    time.sleep(5)
    response = requests.get(url)
    if response.status_code != 200: 
        row['response'] = "Not found"
        rows.append(row)
        continue
    else:
        row['response'] = "Found"
    data = response.json()
    row['number_of_definitions'] = len(data)
    for d in data:
        if 'origin' in d.keys():
            row['origin'] = d['origin']
        else:
            row['origin'] = "No origin found"
    rows.append(row)
    
df = pd.DataFrame(rows)

更新为添加:尽管有其他关于嵌套JSON数据的Stackoverflow问题,但这种情况是不同的,因为不是每个字典都有相同的键。例如,一些条目包含单词来源,而其他条目则不包含


Tags: 数据代码in列表for字典定义response
1条回答
网友
1楼 · 发布于 2024-05-31 23:43:23

尝试使用json_从熊猫规范化:

import requests
import pandas as pd

wordlist = ['illicitly', 'tray', 'tali', 'tart', 'itty']

rows = []
list_data = []
for word in wordlist:
    row = {}
    row['word'] = word
    print(word)
    url = "https://api.dictionaryapi.dev/api/v2/entries/en/"+word
#    time.sleep(5)
    response = requests.get(url)
    if response.status_code != 200: 
        row['response'] = "Not found"
        rows.append(row)
        continue
    else:
        row['response'] = "Found"
    data = response.json()
    list_data.extend(data)
    
for d in list_data:
    if 'origin' not in d:
        d['origin'] = 'NA'

df = pd.json_normalize(list_data, record_path = ['meanings', 'definitions'],
                         meta = ['word', 'phonetic', 'origin',
                                 ['meanings', 'partOfSpeech']],
                         errors = "ignore")

相关问题 更多 >