如何从索引不同的DataFrame构建多层索引的目标DataFrame
问题根因
你原有代码报错的核心原因是索引对齐规则不匹配:你循环赋值时,每次筛选出来的浓度Series仍携带dfA原始的整数索引,和你提前给dfB设置的日期多层索引无法对应,pandas找不到匹配索引的位置就会自动填充NaN,仅第一列可能因巧合索引匹配成功有值。
最优解决方案
不需要手动循环,直接用Pandas内置的透视表功能即可一步生成目标dfB,操作步骤如下:
- 首先将dfA的行索引替换为你需要的日期多层索引,假设你示例中多层索引的两个字段分别为
日期(如083021)和子编号(如14、15、57):
dfA = dfA.set_index(['日期', '子编号'])
- 直接调用
pivot方法生成目标表:
dfB = dfA.pivot(columns='Sample Name', values='Calculated Concentration')
特殊场景适配
- 如果存在「同一个日期多层索引+同一个样本名称」对应多条浓度值的情况,可以用
pivot_table指定聚合规则处理重复值:
dfB = dfA.pivot_table( index=['日期', '子编号'], # 行多层索引字段 columns='Sample Name', # 列字段为样本名 values='Calculated Concentration', # 单元格值为浓度 aggfunc='mean' # 重复值聚合规则,可替换为sum、first、last等 )
- 如果你坚持要保留原有循环逻辑,只需要提前把dfA的索引统一修改为日期多层索引,即可匹配对齐:
# 提前设置dfA的多层索引 dfA = dfA.set_index(['日期', '子编号']) # 初始化dfB的索引和dfA的唯一索引一致 dfB = pd.DataFrame(index=dfA.index.unique()) for name in nameList: dfB[str(name)] = dfA[dfA['Sample Name'] == str(name)]['Calculated Concentration']
内容的提问来源于stack exchange,提问作者pstumps
相关产品推荐
相关产品推荐

