Pandas匹配另一组DataFrame为对应工作表新增列及报错解决
报错原因
报错来自两个代码逻辑错误:
- 字典遍历的变量接收顺序写反。
for sheet, name in bg_d.items()遍历字典时,第一个返回值是字典的键(也就是Sheet1/Sheet2这类字符串类型的工作表名),第二个返回值才是存储实验数据的DataFrame。你把字符串类型的工作表名当成DataFrame执行sheet["Plate"] = val的列赋值操作,字符串本身不支持键值赋值,直接触发类型错误。 - 多余的双层嵌套循环。两个字典的键完全一一对应(都是相同的工作表名),不需要遍历
identifier的所有条目,双层循环还会导致同一个DataFrame被重复赋值、重复追加到结果列表,最终数据完全错乱。
正确实现代码
不需要嵌套循环,直接通过工作表名匹配两个字典的对应数据即可,完整代码如下:
import pandas as pd # 原有Excel读取逻辑保持不变 bg_d = pd.read_excel(f, sheet_name=None, index_col=None, usecols="C:N", skiprows=23, nrows=8) identifier = pd.read_excel(f, sheet_name=None, index_col=None, header=None, usecols="B", skiprows=13, nrows=1) bg_sheets = [] for sheet_name, data_df in bg_d.items(): # 按当前工作表名取对应的样本标识 sample_tag = identifier[sheet_name].iloc[0, 0] # 新增标识列 data_df["Plate"] = sample_tag # 调整列顺序,将标识列移到最左侧 data_df = data_df[["Plate"] + list(data_df.columns[:-1])] bg_sheets.append(data_df) # 合并所有工作表数据得到最终结果 final_df = pd.concat(bg_sheets, ignore_index=True)
运行后final_df的结构完全符合需求:每行以样本标识开头,后续依次是12列实验指标数值。
内容的提问来源于stack exchange,提问作者anony1414
相关产品推荐
相关产品推荐

