Перебирать строки, запрашивать ввод для элементов свыше 0, хранить ответы - PullRequest
0 голосов
/ 22 января 2020

У меня есть простой DF, который я использовал для группировки и суммирования. Теперь я хочу перебрать каждую строку, и если orderqty имеет значение> 0, спросите пользователя: «Сколько из этого элемента {name of item} было выделено?» и затем сохраните этот ответ.

В сохраненном ответе должно быть указано itmdes c (имя элемента). Цель состоит в том, чтобы выполнить итерацию по несгруппированному фрейму данных позже и создать новый столбец для каждой строки, разделив существующее число на сохраненный номер ответа.

Пример DF и кода: Ясно, что этот код не работает, но я чувствую себя довольно растерянным из-за объединения ввода с iterrows Я получил множество ошибок, текущая из которых объект 'str' не вызывается.

Заранее спасибо.

for i, row in sums.iterrows():
      if sums.orderqty > 0:    
      num = int(input("How many (row.itmdesc[i]) were we allocated?"))
    orderqty
itmdesc 
ALCATEL 1X EVOLVE   72
ALCATEL 3V  50
ALCATEL 7   0
ALCATEL GO FLIP 0
ALCATEL GO FLIP 3   28
ALCATEL JOY TAB 53

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Решение было на самом деле очень простым. Выполните итерацию по строкам, сохраните ответы в виде списка, а затем добавьте список в виде столбца в кадр данных. Типы не были одинаковыми, поэтому мне нужно было изменить типы, а затем я мог выполнять математику в новом столбце по мере необходимости. Может быть, более чистый способ сделать это позже, когда я все реорганизовать, но сейчас работает! Спасибо всем.

allocations= []
for i, j in sums.iterrows():
    answer = input(f"How much of {i} were we allocated?")
    allocations.append(answer)

sums['allocation'] = allocations
sums = sums.astype({'orderqty':float,'allocation':float})
sums['order_percent'] = sums['orderqty']/sums['allocation']
0 голосов
/ 22 января 2020

Сразу видно, что ваша третья строка требует отступа. также, если вы собираетесь выполнять итерацию по двум объектам одновременно, вам нужно нормально использовать функцию zip (). Обычно я не использую .iterrows для итерации по таблицам, и мне нравится делать следующее:

это проведет вас через все столбцы и все строки в каждом столбце, вы также можете выполнять итерацию по индексу или диапазону ( len (df)), это даст вам число, которое вы можете использовать с df.iloc [rownum, colnum]

for i in df:
    print(i)
    for j in df[i]:
        print(i,j)

, также генераторы списков могут помочь, если вы перейдете к замедленному и подробному.

они следуют общему синтаксису ниже и могут быть вложенными;

obj = [i if i > 0 else 0 for i in iterable]

Редактировать: также я думаю, что есть большая проблема с превращением вашей строки в int. Вы не можете преобразовать всю эту строку в int, что, по-видимому, вы делаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...