Pandas маскирование указанного c столбца по дате - PullRequest
0 голосов
/ 29 мая 2020

У меня есть фрейм данных (df) с двумя основными столбцами - один называется «TIMESTAMP», представляющий даты, а другой - «Q C», отражающий флаги контроля качества как целые числа. Этот df содержит около 40 000 строк, поэтому я не хочу перебирать каждую из них.

У меня есть новый фрейм данных (dfNew) всего с двумя столбцами из нескольких пар начальной и конечной дат. Я хочу go через мой исходный df и для всех строк, где TIMESTAMP находится между любой из пар дат начала и окончания, перечисленных в dfNew, я хочу заменить значение Q C на -1. Этот dfNew имеет около 400 строк, поэтому я решил, что итерация здесь будет не такой уж плохой.

df выглядит примерно так:

TIMESTAMP       | QC
2019-05-04 00:22    5
2019-05-04 00:24    1
2019-05-09 03:30    3

dfNew выглядит примерно так:

START         | END
20190504_0023   20190504_0024

Итак, я бы хотел заменить QC = 1 для второй строки в df на QC = -1.

Это мой код:

for index, row in dfNew.iterrows():
    df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
    start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
    end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
    masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
    df['QC'].mask(masked, -1)

Однако для почему-то маска не работает. Никакие значения не заменяются на -1. Я думаю, что это может быть связано с тем фактом, что я создаю маску, используя столбец TIMESTAMP, но пытаюсь использовать эту маску для замены значений в столбцах Q C, но я не могу понять, что это такое. Приветствуются любые мысли!

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Думаю, это то, что вам нужно.

df.TIMESTAMP = pd.to_datetime(df.TIMESTAMP)
dfNew.START = pd.to_datetime(dfNew.START, format='"%Y%m%d_%H%M"')
dfNew.END = pd.to_datetime(dfNew.END, format='"%Y%m%d_%H%M"')

def f(row):
    df.loc[df['TIMESTAMP'].between(row[0], row[1]), 'QC'] = -1

dfNew.apply(f, axis=1)
0 голосов
/ 29 мая 2020

Логический выбор

m=df.QC==1

Используйте .lo c аксессуар

df.loc[m,'QC']=-1

enter image description here

0 голосов
/ 29 мая 2020

Главное, что вам нужно установить значения столбцов равными применяемой маске: df['QC'] = df['QC'].mask(masked, -1).

Вам нужно только один раз преобразовать столбец TIMESTAMP в дату и время вне l oop. Предполагая, что у вас есть несколько строк в dfNew, время начала и окончания меняется для каждой строки, поэтому оно остается внутри l oop.

# this should be outside of the loop
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])

for index, row in dfNew.iterrows():
    start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
    end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
    masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
    df['QC'] = df['QC'].mask(masked, -1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...