Tengo 2 columnas en pandas, con datos que se ven así.
code fx category AXD AXDG.R cat1 AXF AXDG_e.FE cat1 333 333.R cat1 ....Hay otras categorías pero solo me interesa cat1.
Quiero combinar todo, desde la columna de code , y todo después de . en la columna fx y reemplace la columna de código con la nueva combinación sin afectar las otras filas.
code fx category AXD.R AXDG.R cat1 AXF.FE AXDG_e.FE cat1 333.R 333.R cat1 .....Aquí está mi código, creo que tengo que usar expresiones regulares, pero no estoy seguro de cómo combinarlo de esta manera.
df.loc[df['category']== 'cat1', 'code'] = df[df['category'] == 'cat1']['code'].str.replace(r'[az](?=\.)', '', regex=True).str.replace(r'_?(?=\.)','', regex=True).str.replace(r'G(?=\.)', '', regex=True)No estoy seguro de cómo seleccionar la segunda columna también. Cualquier ayuda sería muy apreciada.
Podemos obtener el resultado esperado usando split así:
>>> df['code'] = df['code'] + '.' + df['fx'].str.split(pat=".", expand=True)[1] >>> df code fx category 0 AXD.R AXDG.R cat1 1 AXF.FE AXDG_e.FE cat1 2 333.R 333.R cat1 Para filtrar solo en cat1 , como @anky lo hizo muy bien, podemos agregar una instrucción where :
>>> df['code'] = (df['code'] + '.' + df['fx'].str.split(pat=".", expand=True)[1]).where(df['category'].eq("cat1"), df['code'])Hay otras categorias pero solo me interesa cat1
Puede usar str.split con series.where para agregar la extensión para cat1:
df['code'] = (df['code'].astype(str).add("."+df['fx'].str.split(".").str[-1]) .where(df['category'].eq("cat1"),df['code'])) print(df) code fx category 0 AXD.R AXDG.R cat1 1 AXF.FE AXDG_e.FE cat1 2 333.R 333.R cat1Puede extract la parte de fx y agregarla al code :
df['code'] += df['fx'].str.extract('(\..*$)')[0]producción:
code fx category 0 AXD.R AXDG.R cat1 1 AXF.FE AXDG_e.FE cat1 2 333.R 333.R cat1 para limitar a cat1 solamente:
df.loc[df['category'].eq('cat1'), 'code'] += df['fx'].str.extract('(\..*$)')[0]Puedes usar Series.str.extract :
df['code'] = df['code'].astype(str) + np.where(df['category'].eq('cat1'), df['fx'].astype(str).str.extract('(\..+)')[0], '')Producción:
>>> df code fx category 0 AXD.R AXDG.R cat1 1 AXF.FE AXDG_e.FE cat1 2 333.R 333.R cat1Reemplace los alfanuméricos antes del punto. Agregue el resultado al código de columna.
df['code'] +=df['fx'].str.replace('(^[\w]+(?=\.))','',regex=True) code fx category 0 AXD.R AXDG.R cat1 1 AXF.FE AXDG_e.FE cat1 2 333.R 333.R cat1