Удалите строки в Dataframe, если они соответствуют второму dataframe на основе индекса - PullRequest
0 голосов
/ 01 августа 2020

У меня есть фрейм данных, который включает некоторые «недопустимые» строки, которые я хотел бы удалить. У меня есть второй фрейм данных, который содержит эти недопустимые строки.

недопустимые строки =

DatetimeIndex(['2019-11-11', '2019-12-06', '2019-12-13', '2019-12-15',
           '2019-12-17', '2019-12-18', '2019-12-19', '2019-12-31',
           '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-10',
           '2020-01-15', '2020-01-17', '2020-01-22', '2020-02-05',
           '2020-02-07', '2020-02-09', '2020-02-10', '2020-02-12',
           '2020-02-14', '2020-02-19', '2020-02-20', '2020-02-21',
           '2020-02-25', '2020-02-26', '2020-02-28', '2020-03-02',
           '2020-03-04', '2020-03-06', '2020-03-11', '2020-03-12',
           '2020-03-15', '2020-03-22', '2020-03-29', '2020-04-04',
           '2020-04-11', '2020-04-13', '2020-05-13', '2020-05-23',
           '2020-05-29', '2020-05-30', '2020-06-12', '2020-06-15',
           '2020-06-19', '2020-06-24', '2020-06-26', '2020-07-09',
           '2020-07-10', '2020-07-11', '2020-07-12', '2020-07-16',
           '2020-07-17', '2020-07-18', '2020-07-20', '2020-07-23',
           '2020-07-24', '2020-07-26'],
          dtype='datetime64[ns]', name='dateTime', freq=None)

Я хочу удалить эти строки (даты) из:

DatetimeIndex(['2019-11-11 11:00:00', '2019-11-11 12:00:00',
           '2019-11-11 13:00:00', '2019-11-11 14:00:00',
           '2019-11-11 15:00:00', '2019-11-11 16:00:00',
           '2019-11-11 17:00:00', '2019-11-11 18:00:00',
           '2019-11-11 19:00:00', '2019-11-11 20:00:00',
           ...
           '2020-07-26 05:00:00', '2020-07-26 06:00:00',
           '2020-07-26 07:00:00', '2020-07-26 08:00:00',
           '2020-07-26 09:00:00', '2020-07-26 10:00:00',
           '2020-07-26 11:00:00', '2020-07-26 12:00:00',
           '2020-07-26 13:00:00', '2020-07-26 14:00:00'],
          dtype='datetime64[ns]', name='dateTime', length=6196, freq='H')

Я пробовал:

df_steps1h.loc[df_steps1h.index.difference(df_valid.index), ]

и

df_steps1h[~df_steps1h.index.isin(df_valid.index)].dropna()

DataFrames разные, поэтому я не хочу использовать concat или merge. но ничего не удаляет. Есть идеи, почему? Спасибо!

1 Ответ

1 голос
/ 01 августа 2020

Учитывая df как недопустимые строки DataFrame и df_valid как исходный DataFrame, из которого вы хотите удалить.

df_valid.loc[:,"actual_index"]=df_valid.index
df_valid.loc[:,"actual_index"]=df_valid.loc[:,"actual_index"].apply(lambda x: datetime.strftime(x,'%Y-%m-%d'))
df_valid.loc[:,"actual_index"]=pd.to_datetime(df_valid.loc[:,"actual_index"])
df_valid=df_valid[~df_valid.actual_index.isin(df.index)]
df_valid.drop('actual_index', inplace=True, axis=1)

Однако в упомянутом запросе индекс DataFrame имеет тип DatetimeIndex , но значения значительно отличаются от другого DataFrame на основе Frequency .

Решение направлено на преобразование его в аналогичный частота и, следовательно, выполнить операцию.

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