Ошибка ключа при использовании функции назначения panda

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

У меня есть фрейм данных ниже, и я хочу создать новые переменные «profit_loss» и «profit_margin» на основе доходов и бюджета.

         revenue     budget
0      1513528810  150000000
1       378436354  150000000
2       295238201  110000000
3      2068178225  200000000
4      1506249360  190000000
 

Я пытаюсь создать новые переменные с помощью метода pandas assign(), но я получил сообщение об ошибке ниже.

 d.assign(profit_loss = (d['revenue'] - d['budget']), 
         profit_loss_margin = (d['profit_loss'] * 100 / d['revenue']), 
         financial_status = d['profit_loss'].apply(lambda num: 'Profit-Making' if num > 0 else 'Loss- 
         Making'))

/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)    2895                 return self._engine.get_loc(casted_key)    2896             except KeyError as err:
-> 2897                 raise KeyError(key) from err    2898     2899         if tolerance is not None:

KeyError: 'profit_loss'
 

Однако приведенный ниже код работает просто отлично.

 d.assign(profit_loss = (d['revenue'] - d['budget']))
 

Пожалуйста, сообщите, допустил ли я какую-либо ошибку в предыдущих кодах?

Ответ №1:

Вам нужно lambda для работы с новым созданным столбцом, как здесь profit_loss :

 df = d.assign(profit_loss = (d['revenue'] - d['budget']), 
              profit_loss_margin = lambda x: (x['profit_loss'] * 100 / x['revenue']), 
              financial_status =  lambda x: x['profit_loss'].apply(lambda num: 'Profit-Making' if num > 0 else 'Loss- Making'))

print (df)
      revenue     budget  profit_loss  profit_loss_margin financial_status
0  1513528810  150000000   1363528810           90.089386    Profit-Making
1   378436354  150000000    228436354           60.363216    Profit-Making
2   295238201  110000000    185238201           62.741949    Profit-Making
3  2068178225  200000000   1868178225           90.329654    Profit-Making
4  1506249360  190000000   1316249360           87.385887    Profit-Making
 

Комментарии:

1. Спасибо. это работает. Я думаю, что могу пропустить «лямбда», чтобы упростить свои коды.

Ответ №2:

Вы присваиваете переменной df ‘profit_loss’ и пытаетесь использовать ее для назначения новых переменных в том же вызове. Python собирается разрешить все параметры перед вызовом функции. Поэтому, когда он пытается разрешить d['profit_loss'] ваш второй и третий параметр, он еще не существует, потому assign что еще не был вызван. Попробуйте

 d.assign(profit_loss = (d['revenue'] - d['budget']))
d.assign(profit_loss_margin = (d['profit_loss'] * 100 / d['revenue']), 
         financial_status = d['profit_loss'].apply(lambda num: 'Profit-Making' if num > 0 else 'Loss-Making'))