如何优雅地将dict of list of dict结构数据导入Pandas DataFrame并处理缺失值
优雅转换嵌套字典到带缺失值的DataFrame
嘿,我来分享几个实用又优雅的方法,帮你把这个嵌套字典结构的数据集转换成符合需求的DataFrame,同时自动处理缺失的日期值:
方法一:扁平化数据后透视(推荐,代码简洁易读)
这个思路先把嵌套的结构扁平化成统一的三元组格式,再用pandas的透视功能重塑成目标结构,缺失值会自动填充为NaN:
import pandas as pd # 你的原始数据 data = { 'Col1Name': [{'date': '2020', 'value': '1111'}, {'date': '2019', 'value': '2222'}, {'date': '2018', 'value': '3333'}], 'Col2Name': [{'date': '2020', 'value': '777'}, {'date': '2018', 'value': '999'}] } # 把嵌套数据扁平化成 (列名, 日期, 值) 的三元组列表 flat_entries = [ (col_name, item['date'], item['value']) for col_name, items in data.items() for item in items ] # 转换成基础DataFrame df = pd.DataFrame(flat_entries, columns=['column', 'date', 'value']) # 透视得到目标结构:列名为日期,索引为原列名 final_df = df.pivot(index='column', columns='date', values='value') # 调整日期列按降序排列,匹配你要的格式 final_df = final_df.reindex(sorted(final_df.columns, reverse=True), axis=1) print(final_df)
运行后输出:
date 2020 2019 2018 column Col1Name 1111 2222 3333 Col2Name 777 NaN 999
方法二:分步处理每个列后合并
这个方法适合需要对每个列单独做预处理的场景,先把每个列的列表转成小DataFrame,再合并到一起:
import pandas as pd data = { 'Col1Name': [{'date': '2020', 'value': '1111'}, {'date': '2019', 'value': '2222'}, {'date': '2018', 'value': '3333'}], 'Col2Name': [{'date': '2020', 'value': '777'}, {'date': '2018', 'value': '999'}] } # 存储每个列处理后的小DataFrame dfs = {} for col_name, items in data.items(): # 把当前列的条目转成DataFrame,设置date为索引 temp_df = pd.DataFrame(items).set_index('date') # 转置后重命名索引为原列名,方便合并 dfs[col_name] = temp_df.T.rename(index={'value': col_name}) # 用outer join合并所有小DataFrame,保留所有日期 final_df = pd.concat(dfs.values(), axis=0) # 调整日期列按降序排列 final_df = final_df.reindex(sorted(final_df.columns, reverse=True), axis=1) print(final_df)
输出结果和方法一完全一致,同样会自动为缺失的日期填充NaN。
两种方法都能完美处理缺失值,而且代码简洁易维护,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者garyfoohw
相关产品推荐
相关产品推荐

