Сравнение данных Python - PullRequest
       1

Сравнение данных Python

0 голосов
/ 24 сентября 2018

Я пытаюсь запустить проверку данных, сравнивая столбцы внутри фрейма данных и возвращая разницу в%;тем не менее, я не могу заставить условный аспект приведенного ниже кода работать без получения следующего ValueError: ('Значение истинности Series неоднозначно. Используйте a.empty, a.bool (), a.item (), a.Любой () или a.all (). ',' произошел с номером элемента индекса ')

def checks(df):
    if Multi['Masterpack qty'] == Multi['SUBPACK_QTY']:
        Multi['Length Difference'] = abs((Multi['Length']-Multi['SUBPACK_LENGTH'])/((Multi['Length']+Multi['SUBPACK_LENGTH'])/2))
        Multi['Height Difference'] = abs((Multi['Height']-Multi['SUBPACK_HEIGHT'])/((Multi['Height']+Multi['SUBPACK_HEIGHT'])/2))
        Multi['Width Difference'] = abs((Multi['Width']-Multi['SUBPACK_WIDTH'])/((Multi['Width']+Multi['SUBPACK_WIDTH'])/2))
        Multi['Weight Difference'] = abs((Multi['Weight']-Multi['SUBPACK_WEIGHT'])/((Multi['Weight']+Multi['SUBPACK_WEIGHT'])/2))
    elif Multi['Masterpack qty'] == Multi['PACK_QTY']:
        Multi['Length Difference'] = abs((Multi['Length']-Multi['PACK_LENGTH'])/((Multi['Length']+Multi['PACK_LENGTH'])/2))
        Multi['Height Difference'] = abs((Multi['Height']-Multi['PACK_HEIGHT'])/((Multi['Height']+Multi['PACK_HEIGHT'])/2))
        Multi['Width Difference'] = abs((Multi['Width']-Multi['PACK_WIDTH'])/((Multi['Width']+Multi['PACK_WIDTH'])/2))
        Multi['Weight Difference'] = abs((Multi['Weight']-Multi['PACK_WEIGHT'])/((Multi['Weight']+Multi['PACK_WEIGHT'])/2))
    else:
        Multi['Length Difference'] = 'No Match'
        Multi['Height Difference'] = 'No Match'
        Multi['Width Difference'] = 'No Match'
        Multi['Weight Difference'] = 'No Match' 

Multi.apply(checks)

1 Ответ

0 голосов
/ 24 сентября 2018

Есть несколько проблем с вашим кодом.Основные проблемы:

  1. Вы предполагаете, что if и abs работают в векторизованном виде.Это не правдаКаждый оператор if в обычном Python работает с одним логическим значением, а не поэлементно при сравнении двух рядов.
  2. Из-за (1) вы непрерывно перезаписываете целый ряд в каждом из if /elif / else предложения.
  3. Ваша функция ничего не возвращает.Поэтому, используя Multi.apply(checks), вы получите None.

Вместо этого вы можете использовать np.select для задания условий и значений в векторизованном виде.Вот пример для Length Difference:

conds = [df['Masterpack qty'] == df['SUBPACK_QTY'], df['Masterpack qty'] == df['PACK_QTY']]
choices = [((df['Length'] - df['SUBPACK_LENGTH']) / ((df['Length'] + df['SUBPACK_LENGTH'])/2)).abs(),
           ((df['Length'] - df['PACK_LENGTH']) / ((df['Length'] + df['PACK_LENGTH'])/2)).abs()]

df['Length Difference'] = np.select(conds, choices, 'No Match')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...