如何为Pandas DataFrame单元格赋值多维数组?解决赋值报错问题
解决Pandas中给单元格赋值图片多维数组的报错问题
问题背景
我有一个包含图片路径的Pandas DataFrame,需要新增一列存储对应图片的多维数组。尝试了以下代码:
import pandas as pd import numpy as np df = pd.DataFrame(data=[["test.png","dog.png"],[3,4]], columns=["path","B"]) # 创建空列 df = df.assign(image=np.nan) image = # 读取第1行的图片路径对应的图片(如PIL/cv2读取转ndarray) df.iloc[1, df.columns.get_loc("image")] = image
执行时持续报错:
ValueError: Must have equal len keys and value when setting with an ndarray
实际需求是每行的image字段对应本行path字段的图片数组,期望结果如下:
path B image 0 "test.png" 2 NaN 1 "dog.png" 4 [[1,2,...], [255,255,...], ...]
错误原因
直接用iloc给单元格赋值多维数组时,Pandas会默认将数组视为待填充的序列,尝试匹配行/列长度,而非将整个数组作为单个对象存入单元格,从而触发长度不匹配的报错。
解决方案
方法1:apply逐行批量处理(推荐)
定义图片读取函数,通过apply遍历每行生成对应数组:
import pandas as pd import numpy as np from PIL import Image # 修正DataFrame初始化(原数据结构应为每行一个样本) df = pd.DataFrame(data=[["test.png", 2], ["dog.png", 4]], columns=["path", "B"]) # 定义图片读取函数,失败时返回NaN def load_image(row): try: img = Image.open(row["path"]) return np.array(img) except Exception: return np.nan # 新增image列并赋值 df["image"] = df.apply(load_image, axis=1)
方法2:at/iat单个单元格赋值(适合单条修改)
用at(按标签)或iat(按位置)替代iloc,直接将数组作为单个对象存入单元格:
import pandas as pd import numpy as np from PIL import Image df = pd.DataFrame(data=[["test.png", 2], ["dog.png", 4]], columns=["path", "B"]) df["image"] = np.nan # 读取目标图片并转为数组 img = Image.open(df.loc[1, "path"]) img_array = np.array(img) # 按位置赋值 df.iat[1, df.columns.get_loc("image")] = img_array # 或按标签赋值:df.at[1, "image"] = img_array
内容的提问来源于stack exchange,提问作者Daniele Affinita
相关产品推荐
相关产品推荐

