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

#python #date

#python #Дата

Вопрос:

У меня есть набор данных, который выглядит следующим образом:

     ID  Date    
1   3   2016-04-01  
2   3   2016-04-02  
3   3   2016-04-03  
4   3   2016-04-04  
5   3   2016-04-05  
6   3   2017-04-01  
7   3   2017-04-02  
8   3   2017-04-03  
9   3   2017-04-04  
10  3   2017-04-05
11  7   2016-04-01  
12  7   2016-04-02  
13  7   2016-04-03  
14  7   2016-04-04  
15  7   2016-04-05  
16  7   2017-04-01  
17  7   2017-04-02  
18  7   2017-04-03  
19  7   2017-04-04  
20  7   2017-04-05
  

Я хочу изменить год дат с учетом двух условий. Условиями являются значение идентификатора и год даты. Например, если ID = 3 и год 2016, я хочу изменить его на 2014

Ответ №1:

Вы можете использовать что-то вроде этого:

 def f(x):
  if x['ID'] == 3 and '2016' in x['Date']:
    return x['Date'].replace('2014','2016')
else:
  return x['Date']

df['new_column'] = df.apply(f, axis=1)
  

В зависимости от того, как хранится дата, вы должны изменить. Этот пример предназначен для простой строки, но должен быть адаптирован к другим типам.

Если вы хотите использовать лямбда-функцию:

 df['new_column'] = df.apply(lambda x: x['Date'].replace('2014', '2016') if x['ID'] == 3 and '2016' in x['Date'] else x['Date'], axis=1)
  

Ответ №2:

Аналогично, если ваши данные хранятся как datetime объект, ваша соответствующая функция является x['date'] = x['date'].replace(2016) , а ваше условие является x['date'].year == 2014

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

 df['date'] = df.apply(lambda x: x['Date'].replace(2014) if x['ID'] == 3 and x['date'].year == 2016 else x['date'], axis=1)`
  

Вообще говоря, я бы рекомендовал работать с datetime для дат и времени.

Ответ №3:

 data['Date'] = data.apply(lambda x: x['Date'].replace('2016','2014') if (x['ID'] == 3 and "2016" in x['Date']) else x['Date'], axis=1)
  

Вывод:

     ID  Date
0   3   2014-04-01
1   3   2014-04-02
2   3   2014-04-03
3   3   2014-04-04
4   3   2014-04-05
5   3   2017-04-01
6   3   2017-04-02
7   3   2017-04-03
8   3   2017-04-04
9   3   2017-04-05
10  7   2016-04-01
11  7   2016-04-02
12  7   2016-04-03
13  7   2016-04-04
14  7   2016-04-05
15  7   2017-04-01
16  7   2017-04-02
17  7   2017-04-03
18  7   2017-04-04
19  7   2017-04-05