Как извлечь годы из строки в каждой строке и создать новые строки с этими годами - PullRequest
1 голос
/ 07 октября 2019

У меня есть кадр данных, показанный ниже.

df = pd.DataFrame({'business_id':["a","b","c"], 
                   'time':['2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-11-18 01:54:50, 2017-04-20 18:39:06', 
                           '2017-03-12 17:47:20, 2018-09-10 16:40:17',
                           '2014-02-28 12:11:16, 2019-05-30 18:36:57, 2019-07-20 04:54:28'] })

Вот входные данные, сгенерированные из приведенного выше кода.


business_id                                       time
      a            '2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-11-18 01:54:50, 2017-04-20 18:39:06'
      b                        '2017-03-12 17:47:20, 2018-09-10 16:40:17'
      c            '2014-02-28 12:11:16, 2019-05-30 18:36:57, 2019-07-20 04:54:28'

Ниже приведен вывод, который я хотел бы сгенерировать.

business_id                year
    a                      2016 
    a                      2016
    a                      2016
    a                      2017
    b                      2017
    b                      2018
    c                      2014
    c                      2019
    c                      2019

Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 07 октября 2019

Если вам нужен только год и ID:

df[['business_id']].merge(df['time'].str
                        .extractall('(?P<year>\d{4})-')
                        .reset_index(1,drop=True),
                      left_index=True,
                      right_index=True)

Вывод:

  business_id  year
0           a  2016
0           a  2016
0           a  2016
0           a  2017
1           b  2017
1           b  2018
2           c  2014
2           c  2019
2           c  2019
1 голос
/ 07 октября 2019

Начните с explode, а затем объедините индексы.

(pd.merge(df['business_id'], 
           pd.to_datetime(df.time.str.split(',').explode()).dt.year, 
           left_index=True, 
           right_index=True))

  business_id  time
0           a  2016
0           a  2016
0           a  2016
0           a  2017
1           b  2017
1           b  2018
2           c  2014
2           c  2019
2           c  2019
0 голосов
/ 07 октября 2019

Сделано шаг за шагом, сначала начните с правильного форматирования вашего кадра данных с str.split(',') и explode(). Затем убедитесь, что данные считываются как объект даты и времени с pd.to_datetime, наконец .dt.year, чтобы получить год, соответствующий дате:

import pandas as pd 
import numpy as np  
df = pd.DataFrame({'business_id':["a","b","c"], 
                   'time':['2016-04-26 19:49:16, 2016-08-30 18:36:57, 2016-11-18 01:54:50, 2017-04-20 18:39:06', 
                           '2017-03-12 17:47:20, 2018-09-10 16:40:17',
                           '2014-02-28 12:11:16, 2019-05-30 18:36:57, 2019-07-20 04:54:28']})
df['aux'] = df['time'].str.split(',')
df = df.drop('time',axis=1)
df = df.explode('aux')
df['time'] = pd.to_datetime(df['aux'])
df = df.drop('aux',axis=1)
df['year'] = df['time'].dt.year
print(df.head())

Вывод:

  business_id                time  year
0           a 2016-04-26 19:49:16  2016
0           a 2016-08-30 18:36:57  2016
0           a 2016-11-18 01:54:50  2016
0           a 2017-04-20 18:39:06  2017
1           b 2017-03-12 17:47:20  2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...