Cómo usar dos grupos de captura de expresiones regulares para hacer dos columnas de pandas

Nov 09 2020

Tengo una columna de cadenas de marco de datos y quiero extraer números a otra columna:

    column
    1 abc123
    2 def456
    3 ghi789jkl012

He usado:

dataframe["newColumn"] = dataframe["column"].str.extract("(\d*\.?\d+)", expand=True)

Funciona, pero solo captura el primer bloque de números en una columna. Mi salida deseada es

column           newColumn  newColumn2
1 abc123         123        NaN
2 def456         456        NaN
3 ghi789jkl012   789        012

pero no puedo averiguar cómo hacerlo

Respuestas

3 jezrael Nov 09 2020 at 11:08

Usar Series.str.extractallcon Series.unstacky DataFrame.add_prefix, último agregar al DataFrame original mediante DataFrame.join:

df = dataframe.join(dataframe["column"].str.extractall("(\d*\.?\d+)")[0]
                                       .unstack()
                                       .add_prefix('newColumn'))
print (df)
         column newColumn0 newColumn1
1        abc123        123        NaN
2        def456        456        NaN
3  ghi789jkl012        789        012

O puede usar (\d+), gracias @Manakin:

df = (dataframe.join(dataframe["column"].str.extractall("(\d+)")[0]
                                        .unstack()
                                        .add_prefix('newColumn'))
print (df)
wwnde Nov 09 2020 at 11:27

También puede usar split, expand = True y unirse de nuevo a df.

df.join(df.column.str.split('\D+', expand=True).replace({None: np.NaN}).rename({2:'newColumn2',1:'newColumn'},axis=1).iloc[:,-2::])


 

    column newColumn newColumn2
1        abc123       123        NaN
2        def456       456        NaN
3  ghi789jkl012       789        012