Explotar (dividir) entradas de cadenas del marco de datos de Pandas en filas separadas
En Pandas, un requisito común es dividir valores separados por comas en un columna de cadena de texto y cree una nueva fila para cada entrada. Esto se puede lograr a través de varios métodos.
Usando Series.explode() o DataFrame.explode()
Para las versiones 0.25.0 y superiores de Pandas, la serie. Los métodos explode() y DataFrame.explode() proporcionan una manera conveniente de explotar columnas tipo CSV:
Para columnas individuales columnas:
df.explode('column_name')
Para varias columnas:
df.explode(['column1', 'column2']) # Pandas 1.3.0
Vectorizado genérico Función
A continuación se proporciona un enfoque vectorizado más versátil que funciona tanto para columnas normales como para columnas de lista:
def explode(df, lst_cols, fill_value='', preserve_index=False): # Convert CSV string columns to list columns for col in lst_cols: df[col] = df[col].str.split(',') # Extract all non-list columns idx_cols = df.columns.difference(lst_cols) # Calculate list lengths lens = df[lst_cols[0]].str.len() # Create exploded DataFrame result = (pd.DataFrame({ col: np.repeat(df[col].values, lens) for col in idx_cols }, index=np.repeat(df.index.values, lens)) .assign(**{col: np.concatenate(df.loc[lens>0, col].values) for col in lst_cols})) # Handle empty list rows if (lens == 0).any(): result = result.append(df.loc[lens==0, idx_cols], sort=False).fillna(fill_value) # Revert index order and reset index if requested result = result.sort_index() if not preserve_index: result = result.reset_index(drop=True) return result
Aplicaciones
Columna CSV:
df['var1'] = df['var1'].str.split(',')
Lista múltiple Columnas:
explode(df, ['num', 'text'], fill_value='')
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3