#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'))