Pandas中将DataFrame字典类型列拆分为多行并提取字段的问题求解
解决方法
错误原因
explode仅支持对列表、元组等序列类型的列执行行展开操作,直接对字典类型列调用explode,pandas会将字典识别为可迭代的键集合,后续对字符串类型的链接执行迭代操作,就会出现单个字符拆分为单独行的问题。- 将字典转为字符串的操作只会加剧上述问题,字符串迭代的最小单位就是单个字符。
- 原有lambda函数没有正确提取嵌套字典内的页数、日期字段,逻辑存在缺陷。
完整实现代码
import pandas as pd import numpy as np # 处理函数,将嵌套字典转为待展开的列表结构 def process_info(row): info_dict = row['Info'] # 兼容非字典类型的异常值 if not isinstance(info_dict, dict): return [] res = [] for pdf_link, detail_info in info_dict.items(): res.append({ "PDF Link": pdf_link, "Number of Pages": detail_info.get("numberOfPages"), "Creation Date": detail_info.get("date") }) return res # 构造你的测试数据集 data = {'Company URL': {0: 'https://www.eltako.de/', 1: 'https://test.com/'}, 'Potential Client': {0: 1, 1: 0}, 'PDF Link': {0: np.nan, 1: np.nan}, 'Number of Pages': {0: np.nan, 1: np.nan}, 'Creation Date': {0: np.nan, 1: np.nan}, 'Info': {0: {'https://www.eltako.de/wp-content/uploads/2020/11/Eltako_Gesamtkatalog_LowRes.pdf': {'numberOfPages': 440, 'date': '2017-09-20'}}, 1: {'https://new.com': {'numberOfPages': 230, 'date': '2017-09-20'}}}} df = pd.DataFrame(data) # 执行转换逻辑 df['temp'] = df.apply(process_info, axis=1) df = df.explode('temp', ignore_index=True) # 拆分展开后的字段到对应列 df = df.join(pd.json_normalize(df['temp'])) # 清理无用列 df_final = df.drop(['Info', 'temp'], axis=1)
执行后df_final就是你需要的输出结果,原有公共字段(Company URL、Potential Client)会自动复制到拆分后的每一行,不需要单独处理。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

