Могут ли эти проблемные элементы быть изменены как нули с циклом, чтобы сохранить устойчивость?

#python #pandas #list #algorithm #data-structures

Вопрос:

У меня есть фрейм данных, который содержит «дату» в качестве индекса и функцию «Примерное значение». В этом фрейме данных показаны примеры результатов на эти даты. Однако некоторые результаты выборки повторяются, так как образцы не могли быть взяты в указанную дату. Например, был взят первый образец 2019-08-17 07:30:00 . Поскольку второй образец взять не 2019-08-17 08:00:00 удалось , он показывает тот же результат, что и предыдущий. Мне нужно изменить эти значения на нули, чтобы очистить данные, но я не мог понять, как это сделать. Есть ли какой-нибудь возможный способ сделать так, чтобы это произошло? Я поставлю желаемый результат следующим образом dataframe_desired

 dataframe =     
date                    Sample Result
2019-08-17 07:30:00     548.700012
2019-08-17 08:00:00     548.700012
2019-08-17 08:30:00     548.700012
2019-08-17 09:00:00     553.099976
2019-08-17 09:30:00     555.346976
2019-08-17 10:00:00     548.700012
2019-08-17 10:30:00     548.700012
2019-08-17 11:00:00     546.750000
2019-08-17 11:30:00     546.750000

 
 dataframe_desired = 

date                    Sample Result
2019-08-17 07:30:00     548.700012
2019-08-17 08:00:00     0.000000
2019-08-17 08:30:00     0.000000
2019-08-17 09:00:00     553.099976
2019-08-17 09:30:00     555.346976
2019-08-17 10:00:00     548.700012
2019-08-17 10:30:00     0.000000
2019-08-17 11:00:00     546.750000
2019-08-17 11:30:00     0.000000

 

Ответ №1:

Это должно сделать свою работу…

 dataframe["Dup Result"] = dataframe["Sample Result"].duplicated(keep='first')
dataframe["Clean Result"] = dataframe.apply(lambda row: 0.0 if row["Dup Result"] else row["Sample Result"], axis=1)
dataframe = dataframe.drop("Dup Result", axis=1)
 

Комментарии:

1. Этот код пропускает сценарий. Давайте рассмотрим пример 09:00, 09:30 и 10:00. Когда вы запустите этот код, образец 09:30 будет показан как 0. Однако это должно быть 553.346976. Спасибо вам за ответ.

Ответ №2:

Если я правильно понял ваш вопрос, вы пытаетесь установить значения, равные предыдущему нулю. Это можно сделать с помощью метода diff:

 df.loc[df.diff().squeeze()==0]=0
 

Здесь diff возвращает фрейм данных с diff_i,j = df_i,j — df_i-1,j. Squeezez используется для преобразования кадра данных с одним столбцом в серию, чтобы можно было передать его в качестве индекса в loc. Затем мы установили значение 0, где различия равнялись 0.

Ответ №3:

Вы можете использовать diff :

 df.loc[df['Sample Result'].diff().eq(0), 'Sample Result'] = 0
 

Комментарии:

1. Вопрос: Между 2 датами значение не может быть действительно одинаковым? Почему вы используете 0, а не NaN для пропущенных значений?

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