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?
3 respuestas
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
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
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
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.