Tengo el siguiente marco de datos de pandas.
d = {'col1': [1, 2,3,4,5,60,0,0,6,3,2,4],'col3': [1, 22,33,44,55,60,1,5,6,3,2,4],'Name': ['2a df a1asd_V1', 'xcd a2asd_V3','23vg aabsd_V1','dfgdf_aabsd_V0','a3as d_V1','aa bsd_V3','aasd_V4','aabsd_V4','aa_adn sd_V15',np.nan,'aasd_V12','aasd120Abs'],'Date': ['2021-06-13', '2021-06-13','2021-06-13','2021-06-14','2021-06-15','2021-06-15','2021-06-13','2021-06-16','2021-06-13','2021-06-13','2021-06-13','2021-06-16']} dff = pd.DataFrame(data=d) dff col1 col3 Name Date 0 1 1 2a df a1asd_V1 2021-06-13 1 2 22 xcd a2asd_V3 2021-06-13 2 3 33 23vg aabsd_V1 2021-06-13 3 4 44 dfgdf_aabsd_V0 2021-06-14 4 5 55 a3as d_V1 2021-06-15 5 60 60 aa bsd_V3 2021-06-15 6 0 1 aasd_V4 2021-06-13 7 0 5 aabsd_V4 2021-06-16 8 6 6 aa_adn sd_V10 2021-06-13 9 3 3 NaN 2021-06-13 10 2 2 aasd_V12 2021-06-13 11 4 4 aasd120Abs 2021-06-16Quiero hacer dos nuevas columnas basadas en la columna Nombre. Quiero extraer la parte de la cadena en la columna Nombre como V1, V2, V3, V4...V20 así. Además, si no hay nada parecido al final de la cadena de Nombre o si la fila de Nombre está vacía, solo quiere hacer una celda vacía. Así que quiero algo como debajo del marco de datos de pandas.
col1 col3 Name Date Version Version 0 1 1 2a df a1asd_V1 2021-06-13 V1 Version 1 1 2 22 xcd a2asd_V3 2021-06-13 V3 Version 3 2 3 33 23vg aabsd_V1 2021-06-13 V1 Version 1 3 4 44 dfgdf_aabsd_V0 2021-06-14 V0 Version 0 4 5 55 a3as d_V1 2021-06-15 V1 Version 1 5 60 60 aa bsd_V3 2021-06-15 V3 Version 3 6 0 1 aasd_V4 2021-06-13 V4 Version 4 7 0 5 aabsd_V4 2021-06-16 V4 Version 4 8 6 6 aa_adn sd_V10 2021-06-13 V10 Version 10 9 3 3 NaN 2021-06-13 10 2 2 aasd_V12 2021-06-13 V12 Version 12 11 4 4 aasd120Abs 2021-06-16¿Es posible hacer eso? Sé que en SQL podemos hacer eso usando "LIKE"
WHEN `Name` LIKE '%V10%' THEN 'Verison 10'.¿Hay un comando similar o alguna otra forma de hacerlo en python?
¡Gracias por adelantado! ¡Cualquier ayuda es apreciada!
Puede usar str.extract y una expresión regular corta ( _(V\d+)$ ):
dff['Version'] = dff['Name'].str.extract('_(V\d+)$') dff['Version_long'] = 'Version '+dff['Version'].str[1:]NÓTESE BIEN. Nombré la segunda columna de manera diferente ya que es problemático (aunque no del todo imposible) tener dos columnas con el mismo nombre
producción:
col1 col3 Name Date Version Version_long 0 1 1 2a df a1asd_V1 2021-06-13 V1 Version 1 1 2 22 xcd a2asd_V3 2021-06-13 V3 Version 3 2 3 33 23vg aabsd_V1 2021-06-13 V1 Version 1 3 4 44 dfgdf_aabsd_V0 2021-06-14 V0 Version 0 4 5 55 a3as d_V1 2021-06-15 V1 Version 1 5 60 60 aa bsd_V3 2021-06-15 V3 Version 3 6 0 1 aasd_V4 2021-06-13 V4 Version 4 7 0 5 aabsd_V4 2021-06-16 V4 Version 4 8 6 6 aa_adn sd_V15 2021-06-13 V15 Version 15 9 3 3 NaN 2021-06-13 NaN NaN 10 2 2 aasd_V12 2021-06-13 V12 Version 12 11 4 4 aasd120Abs 2021-06-16 NaN NaNUse str.extract con una expresión regular y str.replace para cambiar el nombre de los valores:
dff['Version_short'] = dff['Name'].str.extract('_(V\d+)$').fillna('') dff['Version_long'] = dff['Version_short'].str.replace('V', 'Version ')Producción:
>>> dff col1 col3 Name Date Version_short Version_long 0 1 1 2a df a1asd_V1 2021-06-13 V1 Version 1 1 2 22 xcd a2asd_V3 2021-06-13 V3 Version 3 2 3 33 23vg aabsd_V1 2021-06-13 V1 Version 1 3 4 44 dfgdf_aabsd_V0 2021-06-14 V0 Version 0 4 5 55 a3as d_V1 2021-06-15 V1 Version 1 5 60 60 aa bsd_V3 2021-06-15 V3 Version 3 6 0 1 aasd_V4 2021-06-13 V4 Version 4 7 0 5 aabsd_V4 2021-06-16 V4 Version 4 8 6 6 aa_adn sd_V15 2021-06-13 V15 Version 15 9 3 3 NaN 2021-06-13 10 2 2 aasd_V12 2021-06-13 V12 Version 12 11 4 4 aasd120Abs 2021-06-16Use str.split y str.replace en df.assign en una sola línea
dff = dff.assign(Version_short=dff['Name'].str.split('([A-Z0-9]+$)').str[-2].fillna(''),Version_lon=dff['Name'].str.split('([A-Z0-9]+$)').str[-2].replace('^\D', 'Version ', regex=True).fillna('')) col1 col3 Name Date Version_short Version_lon 0 1 1 2a df a1asd_V1 2021-06-13 V1 Version 1 1 2 22 xcd a2asd_V3 2021-06-13 V3 Version 3 2 3 33 23vg aabsd_V1 2021-06-13 V1 Version 1 3 4 44 dfgdf_aabsd_V0 2021-06-14 V0 Version 0 4 5 55 a3as d_V1 2021-06-15 V1 Version 1 5 60 60 aa bsd_V3 2021-06-15 V3 Version 3 6 0 1 aasd_V4 2021-06-13 V4 Version 4 7 0 5 aabsd_V4 2021-06-16 V4 Version 4 8 6 6 aa_adn sd_V15 2021-06-13 V15 Version 15 9 3 3 NaN 2021-06-13 10 2 2 aasd_V12 2021-06-13 V12 Version 12 11 4 4 aasd120Abs 2021-06-16