You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas基于指定行列列表创建DataFrame并匹配源数据填充方法

实现方案

首先纠正你代码里的逻辑偏差:你之前写的匹配规则把字段对应关系搞反了,行索引row_names对应源表的attribute字段,列名column_names对应源表的start_to_end_date字段,直接用pandas透视+重索引就能实现,不需要写循环或者硬写多条件判断。

完整代码

import pandas as pd

# 第一步:透视源数据,自动按attribute、日期区间匹配val值
pivot_res = df.pivot(
    index="attribute",
    columns="start_to_end_date",
    values="val"
)

# 第二步:按你给定的固定行、列顺序重排,缺失值自动保留为空
df_new = pivot_res.reindex(index=row_names, columns=column_names)

如果源数据可能存在同一个attribute+日期区间有多条重复记录的情况,把pivot换成pivot_table加聚合规则即可:

pivot_res = df.pivot_table(
    index="attribute",
    columns="start_to_end_date",
    values="val",
    aggfunc="first" # 重复记录取第一条,也可以按需求换成sum、mean等
)

效果说明

用你提供的示例源数据跑出来的结果完全符合预期:

  • 已有的匹配项会自动填充对应val值,比如CostOfGoodsAndServicesSold行、2020-04-01 - 2020-06-30列自动填充17.69
  • 源数据里不存在的组合默认填充NaN,如果你需要替换成##.##占位符,加一行代码即可:
df_new = df_new.fillna("##.##")

你之前尝试的代码问题

  • 构造空DataFrame的代码参数传错了:pd.DataFrame第一个位置参数是数据源,你直接传入行名列表,和指定的列、索引维度完全不匹配,自然无法关联源数据的值
  • np.where的写法有两个问题:一是字段对应关系写反,二是列表不能直接和DataFrame的Series做等值判断,会触发长度不匹配报错,就算长度碰巧一致也只会按位置对齐,做不到按键匹配的效果。

内容的提问来源于stack exchange,提问作者Katsu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:36:20