如何从含不同列名的行构造包含缺失列的DataFrame?
构造含缺失列的DataFrame方案
针对你提供的原始数据,这里给出两种可行的实现方法:
方法一:按你的预处理思路实现
步骤1:预处理数据
先将原始字典格式转换为包含year键值对的字典列表:
data = { 2012: [('A', 9), ('C', 7), ('D', 4)], 2013: [('B', 7), ('C', 6), ('E', 1)] } processed_data = [] for year, items in data.items(): # 将年份转为('year', 年份)的元组,再和原有数据合并后转成字典 row_dict = dict([('year', year)] + items) processed_data.append(row_dict)
此时processed_data的结构为:
[{'year': 2012, 'A': 9, 'C': 7, 'D': 4}, {'year': 2013, 'B': 7, 'C': 6, 'E': 1}]
步骤2:生成DataFrame并填充缺失值
用pandas将字典列表转为DataFrame,再把缺失值填充为0,最后调整列顺序:
import pandas as pd # 生成DataFrame df = pd.DataFrame(processed_data) # 缺失值填充为0,并转为整数类型 df = df.fillna(0).astype(int) # 调整列顺序,让year列排在最前面 cols = ['year'] + sorted(col for col in df.columns if col != 'year') df = df[cols]
方法二:直接构造完整行数据
无需预处理成指定列表,直接遍历年份构造包含所有列的行数据:
import pandas as pd data = { 2012: [('A', 9), ('C', 7), ('D', 4)], 2013: [('B', 7), ('C', 6), ('E', 1)] } # 获取所有可能的列名(除year外) all_cols = set() for items in data.values(): all_cols.update(col for col, _ in items) all_cols = sorted(all_cols) # 构造每一行的完整数据 rows = [] for year, items in data.items(): row = {'year': year} # 先初始化所有列为0 for col in all_cols: row[col] = 0 # 填充已有数据 for col, val in items: row[col] = val rows.append(row) # 生成DataFrame df = pd.DataFrame(rows)
最终输出结果
两种方法运行后都会得到目标DataFrame:
year A B C D E 0 2012 9 0 7 4 0 1 2013 0 7 6 0 1
内容的提问来源于stack exchange,提问作者P i
相关产品推荐
相关产品推荐

