Pandas ValueError:新增三列时形状不匹配问题排查
解决Pandas新增列时的ValueError问题
错误原因分析
你碰到的ValueError: Shape of passed values is (6, 3), indices imply (6, 4),核心问题是返回的数据形状和DataFrame预期的结构不匹配:你的bar函数每次返回3个值(对应3列数据),但操作时却试图把这些数据塞进一个有4列的结构里——比如直接覆盖原DataFrame,或者赋值时列数对应错误,导致形状冲突。
修正后的代码
问题出在apply的返回值处理环节,你需要用result_type='expand'参数让Pandas把返回的元组自动展开成多列,再直接赋值给新列名就行。另外顺手把Python2风格的print改成Python3的规范写法(可选,但更通用):
import pandas as pd class MyClass: def __init__(self): pass def foo(self, a, b, c, d): print(f'A: {a} B: {b} C: {c} D: {d}') return 0.0, 0.0 if __name__=="__main__": myClass = MyClass() def bar(row): a = row['A'] b = row['B'] c = row['C'] d = row['D'] e, f = myClass.foo(a, b, c, d) return e, f, e + f # 补全完整的示例DataFrame df = pd.DataFrame({ 'A': [1522083365352316, 1522089025972210, 1522094686592104, 1522100347211998, 1522106007831892, 1522111668451786], 'B': [1.2, 2.3, 3.4, 4.5, 5.6, 6.7], 'C': [10, 20, 30, 40, 50, 60], 'D': [True, False, True, False, True, False] }) # 关键操作:展开返回值并赋值给新三列 df[['E', 'F', 'E_plus_F']] = df.apply(bar, axis=1, result_type='expand') print(df)
为什么这样能解决问题?
axis=1指定按行处理每一行的数据;result_type='expand'会把bar函数返回的元组(3个值)自动展开成3列的DataFrame,刚好匹配你要新增的3列数量;- 通过
df[['E', 'F', 'E_plus_F']]直接赋值,只会在原DataFrame基础上新增列,不会改变原有列的结构,形状完全匹配。
替代方案(不用result_type参数)
如果不想用result_type='expand',也可以手动把apply的结果转换成列表再赋值,效果一样:
df[['E', 'F', 'E_plus_F']] = pd.DataFrame(df.apply(bar, axis=1).tolist())
内容的提问来源于stack exchange,提问作者bisarch
相关产品推荐
相关产品推荐

