numpy.ndarray转DataFrame维度不匹配ValueError报错问题咨询
提问内容
我尝试将一个numpy.ndarray转换为df,并复用another_df的索引,相关代码与输出如下:
another_df: test1 test2 test3 test4 test5 test1 0.0 0.8 0.6 0.6 0.2857142857142857 test2 0.8 0.0 0.5 1.0 0.8571428571428571 test3 0.6 0.5 0.0 1.0 0.7142857142857143 test4 0.6 1.0 1.0 0.0 0.7142857142857143 test5 0.2857142857142857 0.8571428571428571 0.7142857142857143 0.7142857142857143 0.0 print (array) [[ 0.23052147 0.03058967] [-0.54449458 -0.08481665] [-0.21274323 -0.39635658] [ 0.13880332 0.58125618] [ 0.38791301 -0.13067262]] print (type(array)) <class 'numpy.ndarray'> df = pd.DataFrame(array, index = another_df.index, columns = ['x','y'])
转换后可正常得到预期的df,内容如下:
x y test1 0.2305214680511617 0.03058967262464556 test2 -0.544494575705709 -0.08481665342258861 test3 -0.2127432294443813 -0.396356582859552 test4 0.13880332309442767 0.5812561804072454 test5 0.38791301400450073 -0.13067261674975036
但同时会抛出ValueError: Shape of passed values is (5, 1), indices imply (5, 2)错误,我对此存在两点疑问:
- 堆栈信息显示报错发生在return语句之前,但函数仍能正常执行完毕并返回正确结果;
- 待转换的array明显是二维结构,为何会被识别为1维结构?
请问该问题的成因是什么,在结果正常的情况下是否可以忽略该报错?
编辑:修正变量拼写错误
解答
这个报错但结果正常的情况,几乎都是非业务代码逻辑导致的,和你写的DataFrame构造代码无关,具体对应你的两个疑问解释如下:
- 关于报错在return前出现但函数仍正常返回:这个异常根本不是你的主业务线程抛出的。最常见的场景是你使用了带变量实时预览功能的IDE(比如PyCharm、VS Code),IDE会在你构造完DataFrame后,后台静默拉取变量数据做预览渲染,这个过程中IDE自己的缓存逻辑或者索引解析出了问题,抛出了这个异常。因为是IDE后台线程的异常,不会影响你主线程的代码执行,所以你还是能拿到正确的df结果。另一种小概率情况是你这段代码外层套了捕获所有异常的try-except块,异常被捕获后没有终止程序,所以你能看到报错日志但代码继续运行。
- 关于二维array被识别为一维:你打印的array本身shape是(5,2)没有问题,会被识别成(5,1)完全是因为抛出异常的逻辑拿到的不是你当前的array。比如IDE后台缓存了你上一次运行时shape为(5,1)的旧array,拿着旧数据匹配你现在写的两列columns参数,自然就会报shape不匹配的错误。
只要你最终拿到的df的行列数、索引、列名、数值都完全符合预期,且不影响后续代码运行,这个报错完全可以忽略。如果嫌看着烦,可以做两个简单验证确认:
- 把这段代码放到纯Python命令行交互环境运行,不用IDE,要是不报错就完全确认是IDE的后台预览逻辑问题
- 构造df前加一行
print(array.shape),确认输出是(5,2),就能100%确认你的输入数据没有问题
如果排查下来是try-except的问题,只需要缩小异常捕获的范围,不要捕获所有异常即可。
内容的提问来源于stack exchange,提问作者Tim Kirkwood
相关产品推荐
相关产品推荐

