Вопрос:
Я работал над проектом python для автоматизации некоторых отчетов, которые моя команда разрабатывала вручную. Я сталкиваюсь с какой-то упрямой проблемой, я не могу понять, что я делаю.
По существу, область, в которой я застряла, имеет 4 отдельных столбца данных, которые я сделал в общей версии ниже.
Start Time | Finish Time | Not Usable Reason | Start to Finish 12:36 15:36 3:00 16:35 19:45 Production Defect 3:10 19:55 QA Failure
Неиспользуемый разум имеет на высоком уровне два варианта. Пустой текст OR, описывающий проблему. Кроме того, в зависимости от проблемы время окончания может не быть записано из-за некоторой проблемы с QA, которая была замечена до того, как она была закончена, что привело к неиспользованию причины, которая не позволяет начать вычисление.
По существу, то, что я пытаюсь сделать, – это если в столбце “Начало для завершения” есть “Неиспользуемый разум”, введите “-” в это поле.
Код, который я использовал для этого:
processor_df[‘Start to Finish’] = processor_df[‘Finish Time’] — processor_df[‘Start Time’] processor_df[‘Start to Finish’] = processor_df[‘Start to Finish’].astype(str) processor_df[‘Start to Finish’] = processor_df.loc[pd.isnull(processor_df[‘Not Usable Reason’]) == False, ‘Start to Finish’] == ‘—‘ processor_df[‘Start to Finish’] = pd.to_timedelta(processor_df[‘Start to Finish’])
Это представляет собой лишь часть кода, относящегося конкретно к небольшой части, выполняющей расчет, а затем пытается соответствующим образом изменить начальный и конечный столбцы.
Кроме того, я перехожу из timedelta → str → timedelta из-за ошибки, которую я получил, когда я не изменил ее на строку:
ValueError: only leading negative signs are allowed
Проблема в том, что мой желаемый результат:
Start Time | Finish Time | Not Usable Reason | Start to Finish 12:36 15:36 3:00 16:35 19:45 Production Defect — 19:55 QA Failure —
но приведенный выше код производит его как:
Start Time | Finish Time | Not Usable Reason | Start to Finish 12:36 15:36 16:35 19:45 Production Defect False 19:55 QA Failure False
Каков наилучший способ использования проверки, существует ли условие и если оно его заменит. Вышеупомянутое работает, когда я использовал его исключительно для строк, но мое условие не проверяло, было ли оно пустым, но если оно соответствовало определенному значению.
Спасибо за вашу помощь в этом, и если это глупо простая ошибка, я благодарю вас в два раза больше, чтобы помочь новичку.
Лучший,
Энди
Лучший ответ:
В этой строке я думаю, что проблема кроется:
processor_df[‘Start to Finish’] = processor_df.loc[pd.isnull(processor_df[‘Not Usable Reason’]) == False, ‘Start to Finish’] == ‘—‘
Вы в основном перезаписываете столбец ” Start to Finish с булевым массивом. Ваше последнее выражение в строке кода равно == которое возвращает логический массив всех значений False потому что, конечно, строка ‘—‘ не находится ни в одной из ячеек этого столбца.
Следующая строка должна сделать трюк:
processor_df.loc[processor_df[‘Not Usable Reason’].notnull() , ‘Start to Finish’] = ‘—‘
Мы используем .loc, который я бы вообще рекомендовал начать использовать из привычки для индексирования, а не только квадратные скобки, чтобы получить строки, где у нас есть ‘Not Usable Reason’ и столбец ‘Start to Finish’ завершение ‘Start to Finish’ и мы назначаем ( using =, оператор присваивания) строка ‘—‘ для этих ячеек.