首页 > 解决方案 > 使用 np.where 函数时出现“无法使用长度与值不同的多索引选择索引器进行设置”错误

问题描述

我正在尝试以逐行方式迭代地追加两个数据帧。之后,我尝试用其他列中的值填充一列中的 0 值,反之亦然。我正在使用 np.where 函数来填充 0 值。当我单独执行它时,它会给出正确的结果,但是当我在循环中使用它时,它会抛出“无法使用长度与值不同的多索引选择索引器进行设置”错误。我的代码如下所示。

def myfunc(dd1,dd2,dfc):
n=dd1.shape[0]
for i in range(n):
    dfc2=dd1.iloc[i:i+1].append(dd2.iloc[i:i+1])
    dfc=dfc.append(dfc2)
m=dfc.shape[0]
for j in range(m):
    dfc.iloc[j:j+1,2:3]=np.where(dfc.iloc[j:j+1,2:3]==0,dfc.iloc[j+1:j+2,3:4],dfc.iloc[j:j+1,2:3])
    dfc.iloc[j+1:j+2,3:4]=np.where(dfc.iloc[j+1:j+2,3:4]==0,dfc.iloc[j:j+1,2:3],dfc.iloc[j+1:j+2,3:4])
return dfc

其中 dd1 和 dd2 是我的数据帧,我将其中的行迭代地附加到一个空的数据帧 dfc。在这里,我使用行和列索引来填充值。对此的任何帮助将不胜感激。

标签: pythonpandasnumpyloops

解决方案


这不是 np.where 的工作方式。np.where 的输入是一个类似列表的对象。您应该将整个数组输入到 np where,而不是循环数据帧中的每个数据并将其输入 np.where。

dfc.iloc[:,2:3] = np.where(dfc.iloc[:,2:3]==0,dfc.iloc[:,3:4].shift(-1),dfc.iloc[:,2:3])
dfc.iloc[:,3:4] = np.where(dfc.iloc[:,3:4]==0,dfc.iloc[:,2:3],dfc.iloc[:,3:4].shift(-1))

现在应该可以了。请注意 pd.DataFrame.iloc 并在将其分配给新值时避免使用它。我建议您改用 loc 。我的脚本可能有潜在的错误取决于您的熊猫版本。


推荐阅读