如何高效拆分Pandas数据框中字典列表格式的列?
高效拆分Pandas中字典列表列的方案
你的原始代码用iterrows()逐行迭代+df.at赋值,效率低的核心原因是:iterrows()会将每行转为Series带来额外开销,且逐元素修改DataFrame会频繁触发内部数据结构更新,数据量越大越明显。下面是几种更高效的实现方式:
方法一:利用apply生成Series合并(简洁高效)
通过apply将每行的fields列表转换为以label为列名、value为值的Series,再和原DataFrame的formId列合并:
import pandas as pd # 将fields列的字典列表转换为结构化Series fields_df = df['fields'].apply(lambda x: pd.Series({item['label']: item['value'] for item in x})) # 合并原formId列与转换后的字段列 result = pd.concat([df['formId'], fields_df], axis=1)
方法二:列表推导式生成结构化字典(超大数据量首选)
先通过itertuples()(比iterrows()更快)遍历每行,生成包含formId和所有字段键值对的字典列表,最后一次性创建DataFrame:
data = [] for row in df.itertuples(): record = {'formId': row.formId} # 将fields中的字典转为键值对更新到record record.update({item['label']: item['value'] for item in row.fields}) data.append(record) result = pd.DataFrame(data)
方法三:向量化的explode+json_normalize(纯Pandas内部优化)
利用Pandas的向量化函数完成拆分、标准化、 pivot操作,完全避免Python层面的循环:
# 将fields列表拆分为每行一个字典 expanded_df = df.explode('fields') # 标准化字典为列 normalized_df = pd.json_normalize(expanded_df['fields']) # 关联原formId normalized_df['formId'] = expanded_df['formId'].values # 转换为宽表结构 result = normalized_df.pivot( index='formId', columns='label', values='value' ).reset_index() # 移除列名的层级标签 result.columns.name = None
以上三种方法的效率均远高于你的原始代码,其中方法三适合绝大多数场景,方法二更适合超大规模数据集。
内容的提问来源于stack exchange,提问作者Bijan
相关产品推荐
相关产品推荐

