Я использую Pandas в блокноте Jupyter для вычисления следующего из приведенной ниже структуры набора данных, которая содержит дубликаты по столбцу «продукт».
| name | val_id |val_amt | our_val_amt | val_against | product | **NEW FIELD**
| compx | xx1 | 530 | 424 | 418 | XL | 290
| compx | xx1 | 530 | 424 | 134 | CL | 134
| compx | xx2 | 590 | 472 | 600 | XL | 369
| compx | xx2 | 590 | 472 | 103 | CL | 103
Я пытаюсь просмотреть столбец «имя» (в моем примере только 1, но их больше) и выполнить следующие условия if/then. Прежде чем окончательно структурировать данные в соответствии с выводом.
Условия
1. Если 'product' = 'CL' и меньше 'val_against', вставьте значение 'saved_against' в 'NEW FIELD'. например, val_against (134) < our_val_amt (424), поэтому «НОВОЕ ПОЛЕ» = 134 (строка 2).
2.if product = 'XL' и находится в том же 'val_id' (xx1). Остаток, который необходимо вычесть, будет вставлен в «НОВОЕ ПОЛЕ». 'our_val_amt' = 424 - 134 (из шага 1) = 290. Это вставлено над НОВЫМ ПОЛЕМ.
3.Повторите шаги для val_id xx2. НОВОЕ ПОЛЕ CL = 103 и XL = 472 - 103 = 369.
4. Последний шаг реструктурирует данные до желаемого результата ниже.
Я попытался сгруппировать переменные вместе и иметь «продукт» в виде столбцов, но, к сожалению, я получаю более 6000 столбцов и понятия не имею, как вычислить расчет для этого сценария. Я также пытался пройти через цикл без особого успеха.
Желаемый результат:
val id
---------------
| xx1 | xx2 |
| our_val_amt |
---------------------------------------
| product |val_against | 424 | 472 |
----------------------------------------
| XL | 418 | 290 | |
| CL | 134 | 134 | |
| XL | 600 | | 369 |
| CL | 103 | | 103 |
кажется, вы можете сделать это с помощью метода .unstack. проверьте и дайте мне знать, если мой ответ работает для вас
Могу я попросить вас пересмотреть этот вопрос, Акшай stackoverflow.com/questions/75142082/…
Привет, Акшай, интересно, знаешь ли ты, как помочь с этим вопросом? stackoverflow.com/q/75216508/20923737






Это то, что вы ищите?
col = '**NEW FIELD**'
idx = ['product','val_against','val_id','our_val_amt']
r = df.set_index(idx).unstack([-2,-1])[col].reset_index().fillna('')
r
product val_against xx1 xx2
424 472
CL 103 103.0
CL 134 134.0
XL 418 290.0
XL 600 369.0
ПРИМЕЧАНИЕ. Удалите последний .fillna(''), чтобы значения оставались числовыми, и оставьте отсутствующие значения как nan, так как с ними будет намного лучше работать на последующих этапах.
К сожалению, я не смог повторить тот же результат, что и вы. ошибка, которую я вижу, находится в idx = []. Я попробую еще раз завтра и посмотреть, если он работает.
о, что ты имеешь в виду под idx = [ ]? это поле ввода. вы должны определить idx как idx = ['product','val_against','val_id','our_val_amt'] и col как col = 'NEW FIELD'
Можете ли вы опубликовать ошибку и, возможно, скриншот запуска, который вы делаете в своем вопросе?
col = 'НОВОЕ ПОЛЕ' idx = ['product', 'val_id', 'our_val_amt'] r = df6v2_adel.set_index(idx).unstack([-2,-1])[col].reset_index() r KeyError: «НОВОЕ ПОЛЕ»
как вы можете видеть в ошибке, keyerror - это «НОВОЕ ПОЛЕ», что означает, что python не может найти столбец с именем «НОВОЕ ПОЛЕ», каково фактическое имя столбца, которое у вас есть в вашем вопросе **NEW FIELD** ??, просто замените «НОВОЕ ПОЛЕ» на это.
обновил код, проверьте и дайте мне знать, если это работает.
На самом деле я считаю, что мне нужно сделать двойной цикл для столбца «имя», а затем «val_id» из-за структуры моего набора данных. Кроме того, я также пробовал группировать, чтобы сделать его уникальным, но считаю, что это влияет на вычисления, которые я хотел бы выполнить. Спасибо за ваше время.