Diviser (exploser) l'entrée de chaîne de la trame de données Pandas pour séparer les lignes
Problème :
Manipulation d'une trame de données Pandas contenant une colonne de valeurs séparées par des virgules, l'objectif est de diviser chaque champ CSV en lignes individuelles, en préservant les données d'origine structure.
Solution :
La solution recommandée consiste à exploiter la méthode Pandas Series.explode() ou DataFrame.explode(), introduite dans Pandas 0.25.0 et amélioré dans Pandas 1.3.0 pour prendre en charge l'éclatement de plusieurs colonnes.
Pour exploser une seule colonne, utilisez Series.explode() :
df.explode('column_name')
Pour plusieurs colonnes, utilisez DataFrame.explode() :
df.explode(['column1', 'column2'])
Exemple :
df = pd.DataFrame({ 'A': [[0, 1, 2], 'foo', [], [3, 4]], 'B': 1, 'C': [['a', 'b', 'c'], np.nan, [], ['d', 'e']] }) df.explode('A')
Sortie :
A B C 0 0 1 [a, b, c] 0 1 1 [a, b, c] 0 2 1 [a, b, c] 1 foo 1 NaN 2 NaN 1 [] 3 3 1 [d, e] 3 4 1 [d, e]
Pour une approche plus générique qui fonctionne pour plusieurs colonnes normales et de liste, considérez ce qui suit function :
def explode(df, lst_cols, fill_value='', preserve_index=False): # Ensure `lst_cols` is list-alike if lst_cols and not isinstance(lst_cols, (list, tuple, np.ndarray, pd.Series)): lst_cols = [lst_cols] # Calculate lengths of lists lens = df[lst_cols[0]].str.len() # Preserve original index values idx = np.repeat(df.index.values, lens) # Create an "exploded" DataFrame res = (pd.DataFrame({ col:np.repeat(df[col].values, lens) for col in df.columns.difference(lst_cols) }, index=idx) .assign(**{col:np.concatenate(df.loc[lens>0, col].values) for col in lst_cols})) # Append rows with empty lists if (lens == 0).any(): res = (res.append(df.loc[lens==0, df.columns.difference(lst_cols)], sort=False) .fillna(fill_value)) # Revert to original index order and reset if requested res = res.sort_index() if not preserve_index: res = res.reset_index(drop=True) return res
Exemple d'éclatement d'une colonne de type CSV :
df = pd.DataFrame({ 'var1': 'a,b,c d,e,f,x,y'.split(), 'var2': [1, 2] }) explode(df.assign(var1=df.var1.str.split(',')), 'var1')
Sortie :
var1 var2 0 a 1 1 b 1 2 c 1 3 d 2 4 e 2 5 f 2 6 x 2 7 y 2
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!