You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套不规则API字典数据转pandas DataFrame的实现问题

解决方案

提供两种符合要求的实现,都基于pandas原生方法,不需要复杂的嵌套循环,可自动处理字段不统一、缺失的问题。


方案B:每条释义占一行(更适合后续语源统计,优先推荐)

生成的DataFrame中每个释义对应一行,比如单词tart会生成3行数据,后续统计语源时直接按列分组即可,非常方便。
完整代码如下:

import requests
import pandas as pd

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

for word in wordlist:
    resp = requests.get(f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}")
    if resp.status_code == 200:
        # 给每个词条标注所属单词,后续合并不会混乱
        for entry in resp.json():
            entry['word'] = word
            entry['response'] = 'Found'
            raw_entries.append(entry)
    else:
        raw_entries.append({'word': word, 'response': 'Not found'})

# 自动展开嵌套JSON,缺失字段自动填充NaN
df = pd.json_normalize(raw_entries)
# 处理词源字段默认值,无需自己判断键是否存在
df['origin'] = df['origin'].fillna('No origin found')

# 可选:提取首个释义文本到单独列
df['definition'] = df['meanings'].map(
    lambda x: x[0]['definitions'][0]['definition'] if isinstance(x, list) else ''
)

如果需要更细的释义维度(比如不同词性的释义),只需要对meanings列再做一次json_normalize展开即可。


方案A:每个单词占一行

生成的DataFrame中每个单词对应一行,自动生成definition 1、word origin 1这类多列存储多条数据,代码如下:

# 先执行方案B的代码得到df,再做如下聚合转换
df_a = df.groupby('word').agg(
    response=('response', 'first'),
    total_entries=('word', 'count'),
    origin_list=('origin', list),
    definition_list=('definition', list)
).reset_index()

# 把列表拆分为独立列
df_a = df_a.join(
    pd.DataFrame(df_a['origin_list'].tolist(), index=df_a.index).add_prefix('word origin ')
)
df_a = df_a.join(
    pd.DataFrame(df_a['definition_list'].tolist(), index=df_a.index).add_prefix('definition ')
)

# 删除中间临时列
df_a = df_a.drop(columns=['origin_list', 'definition_list'])

语源统计示例

用方案B的结果统计不同语源的单词数量,只需一行代码:

origin_count = df['origin'].value_counts()

内容的提问来源于stack exchange,提问作者user3710004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:36:04