如何用for循环为DataFrame字典中每个DataFrame添加唯一列?
问题分析与解决方案
咱们先拆解下你代码里的问题:
- 你的
codes是个二维嵌套列表(外层多套了一层方括号),所以for i in codes循环时,i拿到的是整个代码列表,而非单个代码值。 - 循环里你一直给
df['Sheet1']赋值,相当于所有操作都只作用在名为Sheet1的DataFrame上,其他工作表完全没被处理,最后自然所有(实际是这个Sheet1)的Code列都被设成同一个值了。
要实现每个DataFrame对应唯一的Code列,咱们可以这么调整:
步骤1:修正codes的结构
先把嵌套的codes转成一维列表,让每个元素都是独立的代码:
# 直接改成一维列表 codes = ['01', '02', '03', '05', '06', '08', '10', '11', '13', '15', '17', '19', '21', '23', '25', '27', '29', '31', '33', '35', '37', '39', '43', '45', '4.55', '48', '52'] # 或者如果保留原嵌套结构,用这行提取内层列表 # codes = codes[0]
步骤2:将工作表与代码一一配对赋值
因为你读取的工作表数量(27个)和代码数量(27个)完全匹配,咱们可以用zip()函数把工作表名称和对应代码绑定,循环给每个DataFrame添加唯一的Code列:
import pandas as pd # 读取Excel文件,sheet_name=None返回字典,键为工作表名,值为对应DataFrame df = pd.read_excel(sales, sheet_name=None, ignore_index=True, skiprows=7) # 遍历配对后的工作表名和代码 for sheet_name, code in zip(df.keys(), codes): df[sheet_name]['Code'] = code
关键说明:
zip(df.keys(), codes)会把字典里的每个工作表名称,和codes列表中对应位置的代码一一绑定,保证每个工作表对应唯一的代码。- 循环中直接操作
df[sheet_name](即每个工作表对应的DataFrame),给它添加Code列并赋值对应的代码,这样每个DataFrame的Code列就都是唯一的了。
另外要注意:确保Excel里的工作表顺序和codes列表的顺序完全对应,因为sheet_name=None读取工作表的顺序是Excel文件里工作表的排列顺序,如果顺序不对,代码和工作表就会匹配错误哦。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

