#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом
Мне нужно настроить time_in_weeks
столбец для записи числа 34. Когда есть дубликат uniqueid
с другим rma_created_date
, это означает, что произошел какой-то сбой. Необходимо изменить 34, чтобы вычислить количество недель между новым самым последним rma_created_date
(в данном случае 2020-10-15) и вычесть rma_processed_date
из приведенной выше строки 2020-06-28.
Я надеюсь, что это имеет смысл с точки зрения того, что я пытаюсь сделать.
До сих пор я делал это
def clean_df(df):
'''
This function will fix the time_in_weeks column to calculate the correct number of weeks
when there is multiple failured for an item.
'''
# Sort by rma_created_date
df = df.sort_values(by=['rma_created_date'])
Теперь мне нужно выполнить то, что я описал выше, но я немного запутался в том, как это сделать. Особенно учитывая, что у нас может быть несколько сбоев, а не только 2.
Я должен получить что-то вроде этого, возвращаемого в качестве вывода
Как вы можете видеть, что произошло с 34
was, он был изменен, чтобы указать количество недель между 2020-10-15
и 2020-06-26
Вот еще один пример с большим количеством строк
Используя предложенное выражение
df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_processed_date.dt.isocalendar().week.sub(df.rma_processed_date.dt.isocalendar().week.shift(1)),df.time_in_weeks)
Я понимаю это
Последнее замечание: если есть дата 1/1/1900, не выполняйте никаких вычислений.
Ответ №1:
Вопрос не очень понятен. Рад исправить, если я неправильно интерпретировал это.
Попробуйте использовать np.where(condition, choiceif condition, choice ifnotcondition)
#Coerce dates into datetime
df['rma_processed_date']=pd.to_datetime(df['rma_processed_date'])
df['rma_created_date']=pd.to_datetime(df['rma_created_date'])
#Solution
df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_created_date.sub(df.rma_processed_date),df.time_in_weeks)
Комментарии:
1. Я добавил пример ожидаемого результата. Делает ли это более понятным?
2. Откуда берется 15?
3. Как вы можете видеть, что случилось с 34, оно было изменено на количество недель между 2020-10-15 и 2020-06-26.
4. 15 пришли, увидев, что, о, эй, похоже, у меня был еще один сбой в 2020-10-15, хорошо, хм, тогда мне нужно скорректировать 34 и взять количество недель между этой новой датой 2020-10-15 и когда мы закончили первую частоту сбоев, поэтому дата выше этой строки в столбце rma_processed_date. Имеет ли это смысл?
5. Не могли бы вы попробовать
df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_processed_date.dt.isocalendar().week.sub(df.rma_processed_date.dt.isocalendar().week.shift(1)),df.time_in_weeks)