Pandas-DataFrame-Stringeinträge in separate Zeilen auflösen (aufteilen)
In Pandas besteht eine häufige Anforderung darin, durch Kommas getrennte Werte in a aufzuteilen Textzeichenfolgespalte und erstellen Sie für jeden Eintrag eine neue Zeile. Dies kann durch verschiedene Methoden erreicht werden.
Verwenden von Series.explode() oder DataFrame.explode()
Für Pandas-Versionen 0.25.0 und höher ist die Serie. Die Methoden explosion() und DataFrame.explode() bieten eine praktische Möglichkeit, CSV-ähnliche Spalten zu explodieren:
Für einzelne Spalten:
df.explode('column_name')
Für mehrere Spalten:
df.explode(['column1', 'column2']) # Pandas 1.3.0
Generic Vectorized Funktion
Ein vielseitigerer vektorisierter Ansatz, der sowohl für normale als auch für Listenspalten funktioniert, wird unten bereitgestellt:
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
Anwendungen
CSV-Spalte:
df['var1'] = df['var1'].str.split(',')
Mehrfachliste Spalten:
explode(df, ['num', 'text'], fill_value='')
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3