如何基于字符串值遍历DataFrames字典,批量填充Excel工作表Dummy列
问题分析
你的代码存在两个核心问题:
- 判断逻辑错误:循环处理DataFrame时,你使用的
student_name是最后一次遍历openpyxl工作表时获取的B2单元格值,导致所有工作表都用同一个值做判断,而非针对每行的Name列值进行判断,完全不符合“根据每行学生名填充”的需求。 - 未保存修改:你修改了DataFrame中的
Dummy列,但没有将修改后的数据写回原Excel文件,所有修改都不会实际生效。
修正后的代码
根据你的需求,提供两种针对性方案:
方案1:全量填充(覆盖原有值)
对每行数据,根据Name列是否为Roberto/Leonardo直接填充Dummy列:
import pandas as pd # 文件路径 file_path = r'C:/Users/machukovich/Desktop/stack_2.xlsx' # 读取所有工作表为DataFrame字典 dict_of_df = pd.read_excel(file_path, sheet_name=None) # 遍历处理每个工作表 for sheet_name, df in dict_of_df.items(): # 针对每行Name列值判断,填充Dummy df['Dummy'] = df['Name'].apply(lambda x: 'success' if x in ['Roberto', 'Leonardo'] else 'failure') # 将修改后的数据写回Excel with pd.ExcelWriter(file_path) as writer: for sheet_name, df in dict_of_df.items(): df.to_excel(writer, sheet_name=sheet_name, index=False)
方案2:仅填充未处理的NaN值
保留已填充的success,仅将剩余NaN值按非目标学生名填充为failure:
import pandas as pd import numpy as np file_path = r'C:/Users/machukovich/Desktop/stack_2.xlsx' dict_of_df = pd.read_excel(file_path, sheet_name=None) for sheet_name, df in dict_of_df.items(): # 仅对Dummy列的NaN值,根据Name列判断填充 df['Dummy'] = np.where( df['Dummy'].isna(), df['Name'].apply(lambda x: 'failure' if x not in ['Roberto', 'Leonardo'] else 'success'), df['Dummy'] ) # 保存结果 with pd.ExcelWriter(file_path) as writer: for sheet_name, df in dict_of_df.items(): df.to_excel(writer, sheet_name=sheet_name, index=False)
特殊场景方案:按工作表B2单元格判断
如果你确实需要根据每个工作表B2单元格的值,统一填充整个表的Dummy列,可使用以下代码:
import pandas as pd from openpyxl import load_workbook file_path = r'C:/Users/machukovich/Desktop/stack_2.xlsx' # 建立工作表名与B2单元格值的映射 wb = load_workbook(file_path) sheet_student_map = {sheet.title: sheet['B2'].value for sheet in wb.worksheets} # 读取所有工作表 dict_of_df = pd.read_excel(file_path, sheet_name=None) # 遍历处理 for sheet_name, df in dict_of_df.items(): student_name = sheet_student_map[sheet_name] if student_name in ['Roberto', 'Leonardo']: df['Dummy'] = df['Dummy'].fillna('success') else: df['Dummy'] = df['Dummy'].fillna('failure') # 保存修改 with pd.ExcelWriter(file_path) as writer: for sheet_name, df in dict_of_df.items(): df.to_excel(writer, sheet_name=sheet_name, index=False)
内容的提问来源于stack exchange,提问作者machukovich
相关产品推荐
相关产品推荐

