使用字典为Pandas DataFrame添加列时触发Columns must be same length as key错误
问题修复:Pandas赋值触发ValueError: Columns must be same length as key
错误原因
你的代码存在两个核心问题:
- 赋值方式不匹配:你用
bank2[['Paragraph']](双层方括号,指定列名列表)接收apply的结果,但apply(axis=1)返回的是一维Series,而非多列的DataFrame。Pandas要求用列列表赋值时,右侧必须是列数匹配的DataFrame,因此触发长度不匹配错误。 - DataFrame初始化冗余:
bank_info里的Paragraph列表多写了一个逗号,导致语法上是4个空字符串元素,但Category和Amount只有3个元素——不过Pandas会自动截断到最短序列生成3行DataFrame,这不是报错的直接原因,但属于代码冗余。
修复方案
方案1:修正赋值方式(用单层方括号)
将bank2[['Paragraph']]改为bank2['Paragraph'],直接用Series赋值给单列:
import pandas as pd court_dict = dict(zip(['INC:INC08 Pensions', 'TX:TX01 Federal Tax', 'HO:HO08 Rent'], [8, 8, 0])) bank_info = { 'Category':['INC:INC08 Pensions', 'TX:TX01 Federal Tax', 'HO:HO08 Rent'], 'Amount':[1250.23, 300.0, 1000], 'Paragraph': ['', '', ''] # 修正多余逗号,保持3个元素 } bank2 = pd.DataFrame(bank_info) def get_column_names(row: pd.core.series.Series, position: int) -> str: category = row['Category'] result = court_dict.get(category, 'd') print(category, result) return result if __name__=="__main__": bank2['Paragraph'] = bank2.apply(lambda row:get_column_names(row, 0), axis=1) # 改为单层方括号 print(bank2)
方案2:用向量化操作替代apply(更高效)
逐行apply效率偏低,直接用map方法实现字典映射,性能更优:
import pandas as pd court_dict = dict(zip(['INC:INC08 Pensions', 'TX:TX01 Federal Tax', 'HO:HO08 Rent'], [8, 8, 0])) bank_info = { 'Category':['INC:INC08 Pensions', 'TX:TX01 Federal Tax', 'HO:HO08 Rent'], 'Amount':[1250.23, 300.0, 1000], 'Paragraph': ['', '', ''] } bank2 = pd.DataFrame(bank_info) if __name__=="__main__": # 直接用map映射字典,不存在的key用fillna填充默认值'd' bank2['Paragraph'] = bank2['Category'].map(court_dict).fillna('d') print(bank2)
运行后输出:
Category Amount Paragraph 0 INC:INC08 Pensions 1250.23 8 1 TX:TX01 Federal Tax 300.00 8 2 HO:HO08 Rent 1000.00 0
内容的提问来源于stack exchange,提问作者Steve Maguire
相关产品推荐
相关产品推荐

