嵌套不规则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
相关产品推荐
相关产品推荐

