Как сделать цикл python с оператором if/then?

Я использую 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 |

На самом деле я считаю, что мне нужно сделать двойной цикл для столбца «имя», а затем «val_id» из-за структуры моего набора данных. Кроме того, я также пробовал группировать, чтобы сделать его уникальным, но считаю, что это влияет на вычисления, которые я хотел бы выполнить. Спасибо за ваше время.

svenvuko 11.01.2023 13:47

кажется, вы можете сделать это с помощью метода .unstack. проверьте и дайте мне знать, если мой ответ работает для вас

Akshay Sehgal 11.01.2023 14:02

Могу я попросить вас пересмотреть этот вопрос, Акшай stackoverflow.com/questions/75142082/…

svenvuko 17.01.2023 05:48

Привет, Акшай, интересно, знаешь ли ты, как помочь с этим вопросом? stackoverflow.com/q/75216508/20923737

svenvuko 24.01.2023 12:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это то, что вы ищите?

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 = []. Я попробую еще раз завтра и посмотреть, если он работает.

svenvuko 12.01.2023 13:45

о, что ты имеешь в виду под idx = [ ]? это поле ввода. вы должны определить idx как idx = ['product','val_against','val_id','our_val_amt'] и col как col = 'NEW FIELD'

Akshay Sehgal 12.01.2023 13:48

Можете ли вы опубликовать ошибку и, возможно, скриншот запуска, который вы делаете в своем вопросе?

Akshay Sehgal 12.01.2023 13:49

col = 'НОВОЕ ПОЛЕ' idx = ['product', 'val_id', 'our_val_amt'] r = df6v2_adel.set_index(idx).unstack([-2,-1])[col].reset_index(‌​) r KeyError: «НОВОЕ ПОЛЕ»

svenvuko 13.01.2023 08:51

как вы можете видеть в ошибке, keyerror - это «НОВОЕ ПОЛЕ», что означает, что python не может найти столбец с именем «НОВОЕ ПОЛЕ», каково фактическое имя столбца, которое у вас есть в вашем вопросе **NEW FIELD** ??, просто замените «НОВОЕ ПОЛЕ» на это.

Akshay Sehgal 13.01.2023 09:39

обновил код, проверьте и дайте мне знать, если это работает.

Akshay Sehgal 13.01.2023 13:27

Другие вопросы по теме