Панды назначают категории номерам в фрейме данных

У меня есть этот фреймворк:

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

Этот процесс кажется действительно простым, а код делает его сложным. Есть ли способ сделать это лучше?

привет, в соответствии с моим пониманием, сначала необходимо извлечь разницу для обоих a, a_r и b, b_r, а затем сравнить разницу и назначить меньше, больше и то же самое на основе этого права?

iamklaus 10.08.2018 17:03

Вычислите различия между a и a_r, назначьте этим различиям Same, More и Less. Сделайте то же самое для b и b_r. Затем проверьте, все ли различия были «одинаковыми». (в этом случае должно быть всего 4 "одинаковых")

jerbear 10.08.2018 22:25
0
2
386
2

Ответы 2

Следующее позволяет вам быстро проверить, совпадают ли значения или нет:

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'

Пример только для 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')  

Другие вопросы по теме