pandas使用np.argwhere新增列报长度不匹配ValueError如何解决
错误原因
np.argwhere 仅会返回判断条件为True的元素对应的索引,不会为条件不成立的行返回任何占位值。你的数据里第0行valsup和up_value值相等,不满足>判断,因此np.argwhere只返回了剩下6085行的索引,长度比原DataFrame的6086行少1,直接赋值给新列就会触发长度不匹配的报错。
修复方法
根据你实际需要的idx_up列效果,选对应方案即可:
- 如果你需要新列和原表行对齐:不满足条件的行留空,满足条件的行填对应原索引,直接用pandas原生的掩码赋值即可,不需要用
np.argwhere
# 初始化列,默认值设为缺失值 df["idx_up"] = pd.NA # 生成判断条件掩码 cond = df["valsup"] > df["up_value"] # 给满足条件的行赋值为对应行索引 df.loc[cond, "idx_up"] = df.index[cond]
运行后第0行因为不满足条件值为缺失值,1~6085行的idx_up值和你之前用np.argwhere拿到的索引完全一致,长度和原表完全匹配,不会报错。
- 如果你只是需要拿到所有满足条件的行索引,不需要做新列:不要把结果赋值给DataFrame列,单独存为变量即可,记得把argwhere返回的二维数组展平成一维方便使用
# 展平后得到一维的索引数组,长度为6085 up_indices = np.argwhere((df["valsup"] > df["up_value"]).values).flatten()
- 如果你需要给满足条件的行按顺序标记序号(不是原行号):可以用累计求和的方式实现
cond = df["valsup"] > df["up_value"] df["idx_up"] = cond.cumsum() # 不满足条件的行设为缺失值 df.loc[~cond, "idx_up"] = pd.NA
这个写法下,第一个满足条件的行(第1行)值为1,第二个(第2行)值为2,以此类推。
核心注意点:pandas要求赋值给新列的一维数据长度必须和原DataFrame行数完全一致,任何长度不匹配的输入都会触发你遇到的ValueError,不要强行把长度不对的结果塞给新列。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

