熊猫为数据框中的数字分配类别

时间:2018-08-10 14:31:28

标签: python pandas numpy if-statement categories

我有这个数据框:

+----------+----------+------------+------------+
| 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。

这个过程看起来真的很简单,代码使它看起来很复杂。有没有更整洁的方法可以做到这一点?

2 个答案:

答案 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。因此,我们只需检查比较AA_rBB_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')