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
Libérer: 2024-12-24 18:06:15
original
267 Les gens l'ont consulté

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')
Copier après la connexion

Pour plusieurs colonnes, utilisez DataFrame.explode() :

df.explode(['column1', 'column2'])
Copier après la connexion

Exemple :

df = pd.DataFrame({
    'A': [[0, 1, 2], 'foo', [], [3, 4]],
    'B': 1,
    'C': [['a', 'b', 'c'], np.nan, [], ['d', 'e']]
})

df.explode('A')
Copier après la connexion

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]
Copier après la connexion

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
Copier après la connexion

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')
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal