首页 > 解决方案 > IndexError:布尔索引与索引数组不匹配

问题描述

我正在尝试以特定方式解决此问题。希望得到有关如何进行的指示。

我有df1,即:

df1 = pd.DataFrame({'Model': ['model1', 'model2', 'model3']})

然后是df2,也就是:

model1 = pd.DataFrame({'Model' : ['model1', 'model1', 'model1'],
                     'Rule' : ['High', 'Low', 'High'],
                     'Name' : ['A', 'B', 'C']})
model2 = pd.DataFrame({'Model' : ['model2', 'model2', 'model2'],
                     'Rule' : ['Low', 'Low', 'High'],
                     'Name' : ['B', 'D', 'F']})
model3 = pd.DataFrame({'Model' : ['model3', 'model3', 'model3'],
                     'Rule' : ['High', 'High', 'High'],
                     'Name' : ['D', 'E', 'F']})
df2 = [model1, model2, model3]

然后是df3,也就是:

df3 = pd.DataFrame({'Name' : ['A', 'B', 'C', 'D', 'E', 'F'],
                     'model1' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'High1' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'Low1' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'model2' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'High2' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'Low2' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'model3' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'High3' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,],
                     'Low3' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,]})

我希望输出看起来像这样:

df3 = pd.DataFrame({'Name' : ['A', 'B', 'C', 'D', 'E', 'F'],
                     'model1' : ['Yes', 'Yes', 'Yes', np.nan, np.nan, np.nan,],
                     'High1' : [0, np.nan, 0, np.nan, np.nan, np.nan,],
                     'Low1' : [np.nan, 0, np.nan, np.nan, np.nan, np.nan,],
                     'model2' : [np.nan, 'Yes', np.nan, 'Yes', np.nan, 'Yes',],
                     'High2' : [np.nan, np.nan, np.nan, np.nan, np.nan, 0,],
                     'Low2' : [np.nan, 0, np.nan, 0, np.nan, np.nan,],
                     'model3' : [np.nan, np.nan, np.nan, 'Yes', 'Yes', 'Yes',],
                     'High3' : [np.nan, np.nan, np.nan, 0, 0, 0,],
                     'Low3' : [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan,]})

这是我的代码:

for model in df1['Model']:
            col_index = df3.columns.get_loc(model)
            df3.iloc[df3['Name'].isin(df2[model]['Name']), col_index] = 'Yes'
            df3.iloc[df3['Name'].isin(df2[model]['Name']) & (df2[model]['Rule']=='High'), col_index+1] = 0
            df3.iloc[df3['Name'].isin(df2[model]['Name']) & (df2[model]['Rule']=='Low'), col_index+2] = 0

这给了我以下错误:

IndexError: boolean index did not match indexed array along dimension 0; dimension is 389 but corresponding boolean dimension is 853

我假设这是由 (df2[model]['Rule']=='High') 引起的,其中 'High' 是一个标量。

注意:我希望代码使用上面代码中所示的 for 循环来完成此操作,因为它有助于我正在做的其他事情。

标签: pythonpandasfor-loopindexingscalar

解决方案


我想你只是在寻找支点

df3.pivot('Name', 'Property', 'Name').notnull()

Property   colA   colB   colC
Name                         
A          True   True  False
B         False  False   True
C          True  False   True

推荐阅读