python - 使用 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。在这里,我使用行和列索引来填充值。对此的任何帮助将不胜感激。
解决方案
这不是 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 。我的脚本可能有潜在的错误取决于您的熊猫版本。
推荐阅读
- python-3.x - 将类传递给“if/else”结构的 Pyparsing setParseAction() 类时出错
- c# - 最大化形式时,面板实际上并未采用全尺寸
- c# - 在配置文件中使用带有 connectionString 的 ObjectContext 并动态加载密码
- java - 从会员应用程序发出会员请求时出错
- c# - 为什么 ReadOnlySpan 不能用作泛型委托和泛型方法的类型参数?
- python - PostgreSql/SQLalchemy 创建包含错误数据类型的列的表
- xaml - 显示与 Xamarin.Forms Previewer 不同的输出的模拟器
- python - 如何让python自动发送邮件
- mysql - mysql比较2个子字符串列
- angular - 在非 Angular 类中获取注入的依赖项