Pandas如何将不规则嵌套列表转为按日期对齐补0的DataFrame
不规则嵌套列表转日期对齐补0的Pandas DataFrame实现
问题背景
- 输入嵌套列表固定结构:每个子元素包含两个列表,依次存储日期序列、对应数值序列,示例数据如下:
nl = [ [['04-05-2021', '05-05-2021', '06-05-2021'],[2240, 3528, 2800]], [['03-05-2021', '04-05-2021', '05-05-2021'],[123032, 18312, 123872]] ]
- 转换规则:
- 日期作为索引列
- 不同分组的数值作为独立列
- 日期无匹配值的位置填充0
- 预期输出效果:
DATE 1 2 03-05-2021 0 123032 04-05-2021 2240 18312 05-05-2021 3528 123872 06-05-2021 2800 0
- 原有代码问题:直接对转置后的DataFrame做横向拼接,没有将日期设为索引做对齐,导致日期列和数值列混排,输出不符合要求。
正确实现方案
核心逻辑:先将每个子列表转换为以日期为索引的Series,再做横向拼接,Pandas会自动按索引(日期)对齐,最后补0调整格式即可。
完整可运行代码:
import pandas as pd nl = [ [['04-05-2021', '05-05-2021', '06-05-2021'],[2240, 3528, 2800]], [['03-05-2021', '04-05-2021', '05-05-2021'],[123032, 18312, 123872]] ] series_list = [] # 逐组构造日期索引的Series for date_seq, val_seq in nl: series_list.append(pd.Series(val_seq, index=date_seq)) # 横向拼接,自动按日期索引对齐 df = pd.concat(series_list, axis=1) # 缺失值补0,转整数类型 df = df.fillna(0).astype(int) # 设置列名、索引名匹配预期格式 df.columns = [1, 2] df.index.name = 'DATE' print(df)
逻辑说明
- 构造Series时显式指定日期为索引,会自动建立日期到数值的映射关系
pd.concat横向拼接多组Series时,会自动合并所有出现过的日期作为统一索引,无对应值的位置默认填充NaN- 最后通过
fillna(0)补全空值,调整列名和索引名即可得到完全符合预期的结果
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

