Tengo un marco de datos que se muestra a continuación.

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'] })

Aquí está la entrada generada a partir del código anterior.


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'

A continuación se muestra la salida que me gustaría generar.

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

¿Cómo debo hacer esto?

1
user7755336 7 oct. 2019 a las 21:13

3 respuestas

La mejor respuesta

Si solo necesita el año y la identificación:

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

Salida:

  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
Quang Hoang 7 oct. 2019 a las 18:25

Comience con explode y luego combine los índices.

(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
1
rafaelc 7 oct. 2019 a las 18:18

Hecho paso a paso, primero comience formateando su marco de datos correctamente con str.split(',') y explode(). Luego, asegúrese de que los datos se lean como un objeto de fecha y hora con pd.to_datetime, finalmente .dt.year para obtener el año correspondiente a la fecha:

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())

Salida:

  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
0
Celius Stingher 7 oct. 2019 a las 18:20
58275018