我有这个数据框:
+----------+----------+------------+------------+
| values_A | values_B | values_A_r | values_B_r |
+----------+----------+------------+------------+
| 1.623 | 1.91232 | 1.6 | 1.9123 |
| 1.582 | 1.32154 | 1.6 | 1.3215 |
+----------+----------+------------+------------+
我想找到values_A(四舍五入为1位数)和values_A_r之间的差异,以及values_B(四舍五入为4位数)与values_B_r之间的差异。根据差异分配类别“相同”,“更多”或“较少”。如果所有差异均为“相同”,则打印一条消息。这是我当前的代码。
def test_func():
check['A_check'] = np.where(abs(round(check.values_A,1) - check.values_A_r)<1**-10, 'Same',
np.where(round(check.values_A,1) > check.values_A_r, 'Less', 'More'))
check['B_check'] = np.where(abs(round(check.values_B,4) - check.values_B_r)<1**-10, 'Same',
np.where(round(check.values_B,4) > check.values_B_r, 'Less', 'More'))
if (set([len(check.index)])==set([check.A_check.value_counts().Same,
check.B_check.value_counts().Same])):
return print('Correct!')
else:
raise SystemExit('Incorrect.')
test_func()
我目前正在使用嵌套的np where语句来分配类别,它看起来确实很混乱。另外,我必须使用<1 **-10而不是== 0,因为有时当数字为“相同”时,计算得出的差值类似于8 **-12而不是0。
这个过程看起来真的很简单,代码使它看起来很复杂。有没有更整洁的方法可以做到这一点?
答案 0 :(得分:0)
以下内容可让您快速检查值是否相同:
if ((check.values_A.round(1) - check_values_A_r).abs() < 1e-10).sum() == \
((check.values_B.round(4) - check_values_B_r).abs() < 1e-10).sum():
print('Correct!')
else:
raise SystemExit('Incorrect.')
这里我们使用的是布尔型pd.Series
的方便属性,即True
等于1
,而False
等于0
。因此,我们只需检查比较A
与A_r
和B
与B_r
得到的布尔序列是否具有相同数量的True
值。>
以下内容应为您提供A_check
列:
check['A_check'] = 'Same'
diff_A = (check.values_A.round(1) - check_values_A_r).abs()
check.loc[diff_A > 1**-10, 'A_check'] = 'More'
check.loc[diff_A < -1**-10, 'A_check'] = 'Less'
答案 1 :(得分:0)
仅A的示例; B则相同:
import pandas as pd
d = {'values_A': [1.623,1.582], 'values_A_r': [1.6,1.6]}
df = pd.DataFrame(data=d)
dfr = abs(round(df.values_A,1) - df.values_A_r) < 1e-10
if len(dfr.index) == dfr.agg('sum'):
print('correct')
else:
print('incorrect')