Maison >développement back-end >Tutoriel Python >Comment diviser les valeurs séparées par des virgules dans un DataFrame Pandas en lignes distinctes ?

Comment diviser les valeurs séparées par des virgules dans un DataFrame Pandas en lignes distinctes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-24 18:06:15272parcourir

How to Split Comma-Separated Values in a Pandas DataFrame into Separate Rows?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn