2017-02-15 7 views
0

Следующий код должен выполнить несколько шагов:Нанести вложенные, если заявление на ФРЕ

  1. если колонка использования «оптовых данных»> = столбец «МБС», чем
  2. Subtract колонок «оптовые данные» - «MBS "
  3. Умножить разность на основе следующей таблице

    • 32 - 0,56
    • 64 - 0.5
    • 128 - 0,4
    • 256 - 0,4
    • 512 - 0,3
    • +1024 - 0,3
  4. Для всех других возможных вариантов - 0

Я получил следующий код

if df['Wholesale Data Usage'] >= df['mbs']: 
    if df['mbs'] == "32": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.5 
    elif df['mbs'] == "64": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.5 
    elif df['mbs'] == "128": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.4 
    elif df['mbs'] == "256": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.4 
    elif df['mbs'] == "512": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.3 
    elif df['mbs'] == "1024": 
     df['Additional Charge'] = (df['Wholesale Data Usage'] - df[ 
     'mbs']) * 0.3 
    else: 
     df['Additional Charge'] = 0 
else: 
    df['Additional Charge'] = 0 

Не уверен, что я делаю wr Онг.

+0

Отступа неправильно в начале и в конце. Кажется, что у вас два оператора 'else', но с неправильным отступом трудно узнать. Вы можете использовать словарь для таблицы, это было бы намного проще. – cdarke

ответ

0

Youve получил код так сложно читать его трудно отлаживать. Стиль кодирования поможет вам увидеть свои собственные ошибки, которые я думаю. Что, если вы написали это так?

mbs = df['mbs'] 
wdu = df['Wholesale Data Usage'] 

ac = 0 
if wdu >= mbs and mbs == "32" : ac = (wdu - mbs) * 0.56 
if wdu >= mbs and mbs == "64" : ac = (wdu - mbs) * 0.5 
if wdu >= mbs and mbs == "128" : ac = (wdu - mbs) * 0.4 
if wdu >= mbs and mbs == "256" : ac = (wdu - mbs) * 0.4 
if wdu >= mbs and mbs == "512" : ac = (wdu - mbs) * 0.3 
if wdu >= mbs and mbs == "1024" : ac = (wdu - mbs) * 0.3 

df['Additional Charge'] = ac 

Это, как говорится, у вас есть проблема типа. I первое равенство mbs=="32" вы сравниваете, как будто у вас есть строка. Затем в уравнении вы пытаетесь добавить значения, как если бы они содержали int, который не будет работать. Позволяет сделать типы consitent.

mbs = float(df['mbs']) 
wdu = float(df['Wholesale Data Usage']) 

ac = 0 
if wdu >= mbs and mbs == 32 : ac = (wdu - mbs) * 0.56 
if wdu >= mbs and mbs == 64 : ac = (wdu - mbs) * 0.5 
if wdu >= mbs and mbs == 128 : ac = (wdu - mbs) * 0.4 
if wdu >= mbs and mbs == 256 : ac = (wdu - mbs) * 0.4 
if wdu >= mbs and mbs == 512 : ac = (wdu - mbs) * 0.3 
if wdu >= mbs and mbs == 1024 : ac = (wdu - mbs) * 0.3 

df['Additional Charge'] = str(ac) #<- you need to know what the expected type is here. 
0

Прежде всего, для 32 вы умножаетесь на 0.5 и не 0.56.

Тогда, кажется, что вы смешали Струны и типа Integer. Если данные, хранящиеся в df['Wholesale Data Usage'] и df['mbs'], имеют тип String, то вы не можете проверить больше (>=) и не можете вычесть один из другого.

Я подозреваю, что данные, хранящиеся в словаре типа Integer или Float или Double. В этом случае вы пытаетесь сравнить данные в строки и должны изменить следующее:

if df['mbs'] == "32": 

к:

if df['mbs'] == 32: 

и сделать то же самое для каждого сравнения

0

Я думаю, что у вас только несколько проблем с вашей логикой и способ, которым код будет проходить через логику, например. Вы проверяете, равен ли столбец mbs, но на самом деле это должно быть, если разница между столбцом Wholesale Data Usage и столбцом mbs равна 32.

Это должно исправить вашу логику без редактирования слишком много коды:

df['mbs'] = np.where(df['Wholesale Data Usage'] >= df['mbs'], df['Wholesale Data Usage']-df['mbs'], 0) 

if df['mbs'] == "32": 
    df['Additional Charge'] = (df['mbs']) * 0.5 
elif df['mbs'] == "64": 
    df['Additional Charge'] = (df['mbs']) * 0.5 
elif df['mbs'] == "128": 
    df['Additional Charge'] = (df['mbs']) * 0.4 
elif df['mbs'] == "256": 
    df['Additional Charge'] = (df['mbs']) * 0.4 
elif df['mbs'] == "512": 
    df['Additional Charge'] = (df['mbs']) * 0.3 
elif df['mbs'] == "1024": 
    df['Additional Charge'] = (df['mbs']) * 0.3 
else: 
    df['Additional Charge'] = 0 
+0

Я не думаю, что так ... Это общее использование превышает лимит, на который они начисляются ставка плюс дополнительная плата за каждую единицу за лимит. Поэтому его логика работает. Я предполагаю, что 'df ['Total Cost']' is calced 'df ['Regualr Charges'] + df ['дополнительные сборы'], так что он вычисляет избыточные сборы в приведенном выше. Кажется, ваша логика дает скидку на переезд? – gbtimmon