使用 python 在数据框中进行条件格式化
conditional formatting in dataframe using python
我有一个pandas数据框,我需要根据指定的条件对其进行分类。阈值是固定的,需要根据8种不同的阈值组合进行分类。
Threshold (A => 7, B = 3 or 4, C = between 22 - 27)
我尝试使用 pandas 和条件操作来对数据进行分类,但它产生了误导性的结果。
条件是:
1. class1=f[(f['A']>7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
2. class2=f[(f['A']>7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
3. class3=f[(f['A']<7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
4. class4=f[(f['A']>7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
5. class5=f[(f['A']>7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
6. class6=f[(f['A']<7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
7. class7=f[(f['A']<7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
8. class8=f[(f['A']<7.0)|((f['B']!=3.0)&(f['B']!=4.0))| ((f['C']<=22.0)&(f['C']>=27.0))]
我需要根据条件对数据框中的所有行进行分类。
您的情况:您的数据框名为 f
,包含 3 列数值。这些列称为 'A'
、'B'
和 'C'
。
我建议 通过创建布尔列并将它们组合起来以匹配您的 类 来实现。可能有更多的方法可以做到这一点,也有更优雅的方法。我认为这个解决方案非常简单。本质上,你可以满足三个条件:
check_a = f['A'] >= 7
check_b = (f['B'] == 3) | (f['B'] == 4)
check_c = (22 <= f['C'] <= 27)
结合这 3 项检查将构建您的 8 个案例(~
否定布尔值,因此基本上翻转它们的值):
f['class_1'] = check_a & check_b & check_c
f['class_2'] = check_a & check_b & ~check_c
f['class_3'] = ~check_a & check_b & check_c
f['class_4'] = check_a & ~check_b & check_c
f['class_5'] = check_a & ~check_b & ~check_c
f['class_6'] = ~check_a & check_b & ~check_c
f['class_7'] = ~check_a & ~check_b & check_c
f['class_8'] = ~check_a & ~check_b & ~check_c
您的代码不起作用的原因之一是您正在检查 'C'
列中的值是否既小于 22 又大于 27。这永远不可能是真的。
我有一个pandas数据框,我需要根据指定的条件对其进行分类。阈值是固定的,需要根据8种不同的阈值组合进行分类。
Threshold (A => 7, B = 3 or 4, C = between 22 - 27)
我尝试使用 pandas 和条件操作来对数据进行分类,但它产生了误导性的结果。
条件是:
1. class1=f[(f['A']>7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
2. class2=f[(f['A']>7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
3. class3=f[(f['A']<7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
4. class4=f[(f['A']>7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
5. class5=f[(f['A']>7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
6. class6=f[(f['A']<7.0)&((f['B']==3.0)|(f['B']==4.0))& ((f['C']<=22.0)&(f['C']>=27.0))]
7. class7=f[(f['A']<7.0)&((f['B']!=3.0)&(f['B']!=4.0))& ((f['C']>=22.0)&(f['C']<=27.0))]
8. class8=f[(f['A']<7.0)|((f['B']!=3.0)&(f['B']!=4.0))| ((f['C']<=22.0)&(f['C']>=27.0))]
我需要根据条件对数据框中的所有行进行分类。
您的情况:您的数据框名为 f
,包含 3 列数值。这些列称为 'A'
、'B'
和 'C'
。
我建议 通过创建布尔列并将它们组合起来以匹配您的 类 来实现。可能有更多的方法可以做到这一点,也有更优雅的方法。我认为这个解决方案非常简单。本质上,你可以满足三个条件:
check_a = f['A'] >= 7
check_b = (f['B'] == 3) | (f['B'] == 4)
check_c = (22 <= f['C'] <= 27)
结合这 3 项检查将构建您的 8 个案例(~
否定布尔值,因此基本上翻转它们的值):
f['class_1'] = check_a & check_b & check_c
f['class_2'] = check_a & check_b & ~check_c
f['class_3'] = ~check_a & check_b & check_c
f['class_4'] = check_a & ~check_b & check_c
f['class_5'] = check_a & ~check_b & ~check_c
f['class_6'] = ~check_a & check_b & ~check_c
f['class_7'] = ~check_a & ~check_b & check_c
f['class_8'] = ~check_a & ~check_b & ~check_c
您的代码不起作用的原因之一是您正在检查 'C'
列中的值是否既小于 22 又大于 27。这永远不可能是真的。