我正在尝试创建一个函数,该函数可以从Expert_Grading_Score列中从其他列(受试者和处理)中取出1的第一个实例。我创建了两个来自主题和治疗列的所有唯一值的列表:

subj_list = df_sorted['subj'].unique().tolist()
print(subj_list)

输出: [1001、1003、1004、1005、1005、1007、1008、1009、1010、101、1012、1013、1014、1015、1015、1016、1017、1018、1018、1019、1020、1021、1022]

Treatment_list = df_sorted['Treatment'].unique().tolist()
print(Treatment_list)

输出: ['mppddu','product a','product c','product d','product e','product f','product g','product h','std s2','std s2','product b', 'producti','product j']

然后,我创建了一个嵌套的循环,以根据主题对每种product进行分类并应用ILOC:

score = 1 
for idx, subject in enumerate(subj_list):
    for idx2, treatment in enumerate(Treatment_list):
        selected_subsite = df_sorted[(df_sorted.subj == subject) & (df_sorted.Treatment == treatment) & (df_sorted.Expert_Grading_Score == score)].iloc[0]
        print(selected_subsite)

在这一点上,我得到了我想要的ouptut,但是当我达到主题1001的productB时会出现索引错误。在考虑并检查了主datatables之后,我意识到某些受试者缺少某些治疗方法,在这种情况下, b对于受试者1001。我尝试添加带有条件的继续语句以规避丢失的数据:

score = 1 
for idx, subject in enumerate(subj_list):
    for idx2, treatment in enumerate(Treatment_list):
        if treatment != '':
            selected_subsite = df_sorted[(df_sorted.subj == subject) & (df_sorted.Treatment == treatment) & (df_sorted.Expert_Grading_Score == score)].iloc[0]
            print(selected_subsite)
        if treatment == '':
            continue

但是有同样的错误。如何调整此代码,以便跳过缺少数据点并继续在其余部分中运行?任何建议都将不胜感激!

输入dataframe (left)和输出dataframe (right)的示例:

分析解答

try/except块替换if语句,如下所示:

try:
    selected_subsite = df_sorted[(df_sorted.subj == subject) & (df_sorted.Treatment == treatment) & (df_sorted.Expert_Grading_Score == score)].iloc[0]
    print(selected_subsite)
except IndexError as e:
    continue

您的代码通过处理列中的唯一值列表进行迭代,因此治疗永远不会是空的,第二个条件将永远无法达到。

有了上面提供的此逻辑,当没有匹配treatmentsubject变量的行时,它将处理IndexError异常并继续迭代。