You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:15:01