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
相关产品推荐
相关产品推荐

