Как изменить значение во фрейме данных, используя несколько условий с помощью loc?

#python #pandas #dataframe #time-series #assign

#python #pandas #фрейм данных #временные ряды #назначить

Вопрос:

Я хочу изменить значение из строки / столбца фрейма данных следующим образом:

В течение интервала, когда он нашел значение, которое отличается равным 1, тогда он должен поставить 2.

Пример:

начальный df:

 index                      event
2019-12-07 18:30:16         0
2019-12-07 19:30:16         0           
2019-12-07 20:30:16         0           
2019-12-07 21:30:16         0           
2019-12-07 22:30:16         1
  

требуется df:

 index                      event
2019-12-07 18:30:16         0
2019-12-07 19:30:16         0           
2019-12-07 20:30:16         0           
2019-12-07 21:30:16         0           
2019-12-07 22:30:16         2
  

Следующий код работает, но я не могу изменить значение:

 mask = (df.index > start_dates) amp; (df.index <= end_dates)

for k in range (0, len(df.loc[mask])):
    if df.loc[mask].event[k] == 1:
        df.loc[mask].loc[df.loc[mask].event == 1, "event"] = 2
  

Я не могу изменить значение с 1 на 2 в последней строке кода.

Я также пробовал это…:

 df.loc[mask].loc[df.loc[mask].event == 1, "event"] = 2
df.loc[mask].event[df.loc[mask].event == '1'] = 2
df.loc[mask].event[k] = 2
  

Но ни одна из приведенных выше строк не работает.

Пожалуйста, помогите мне. : (Любая помощь высоко ценится!

Ответ №1:

Три строки, которые вы попробовали в конце, — это то, что pandas называет «chained loc calls», которые будут завершаться ошибкой каждый раз, если вы захотите использовать их для присвоения новых значений. Одного .loc достаточно для того, что вы хотите

 df.loc[mask] = 2
 # or
df.loc[mask, :] = 2
# both will assign two to all columns if you have more

# or also
df.loc[mask, 'event'] = 2
  

Цикл не нужен, .loc будут выбраны нужные строки с помощью логической маски.

Редактировать

Вы можете включить третье условие в свою маску

 mask = (df.index > start_dates) amp; (df.index <= end_dates) amp; (df.event ==1)
  

Или оставьте свою маску как есть и объедините условия внутри .loc

 df.loc[mask amp; (df.event ==1), 'event'] = 2
  

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

1. Я пробовал это, но они присваивают значение 2 всему столбцу, и я хотел бы, чтобы оно было только там, где равно 1. Как это должно быть изменено в этом случае?

Ответ №2:

Может быть, вы хотите попробовать это: допустим, у вас есть фрейм данных, подобный этому:

 df = pd.DataFrame(data={"index":[1,2,3,4], "val":[0,0,1,0],"event":[0,0,0,0]})
  

И вы хотите увеличить значение val, когда значение val равно 1. Затем вы просто делаете:

 df.loc[df['val'] == 1, 'val'] = 2