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