Pandas - если ячейка пуста, превратить ячейку pd.timedelta [ns64] в строку '-' - PullRequest
0 голосов
/ 05 июля 2018

Я работал над проектом на 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

Неиспользуемая причина имеет на высоком уровне два варианта. Пустой ИЛИ текст, описывающий проблему. Кроме того, в зависимости от проблемы, время окончания, возможно, не было записано из-за некоторой проблемы 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

Как лучше всего использовать проверку, если условие существует и заменяет ли оно. Выше сказанное сработало, когда я использовал его исключительно для строк, но мое условие не проверяло, было ли оно пустым, а соответствовало ли оно конкретному значению.

Спасибо за вашу помощь в этом, и если это глупо простая ошибка, я в два раза больше благодарю вас за помощь новичку.

Best

Andy

1 Ответ

0 голосов
/ 05 июля 2018

Я думаю, что в этой строке лежит проблема:

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', и мы назначаем ( используя =, оператор присваивания) строку '--' для этих ячеек.

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