Heim >Backend-Entwicklung >Python-Tutorial >Wie teile ich durch Kommas getrennte Werte in einem Pandas-DataFrame in separate Zeilen auf?

Wie teile ich durch Kommas getrennte Werte in einem Pandas-DataFrame in separate Zeilen auf?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-24 18:06:15279Durchsuche

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

Pandas-Datenrahmen-Zeichenfolgeneintrag aufteilen (explodieren), um Zeilen zu trennen

Problem:
Manipulation eines Pandas-Datenrahmens Das Ziel besteht darin, jedes CSV-Feld in einzelne Zeilen aufzuteilen und dabei die Werte beizubehalten, die eine Spalte mit durch Kommas getrennten Werten enthalten ursprüngliche Datenstruktur.

Lösung:

Die empfohlene Lösung besteht darin, die in Pandas 0.25 eingeführte Methode Pandas Series.explode() oder DataFrame.explode() zu nutzen. 0 und wurde in Pandas 1.3.0 erweitert, um die Explosion mehrerer Spalten zu unterstützen.

Um eine einzelne Spalte aufzulösen, verwenden Sie Series.explode():

df.explode('column_name')

Für mehrere Spalten verwenden Sie DataFrame.explode():

df.explode(['column1', 'column2'])

Beispiel:

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

df.explode('A')

Ausgabe:

     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]

Für einen allgemeineren Ansatz, der für mehrere Normal- und Listenspalten funktioniert, beachten Sie Folgendes Funktion:

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

Beispiel für die Auflösung einer CSV-ähnlichen Spalte:

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')

Ausgabe:

  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

Das obige ist der detaillierte Inhalt vonWie teile ich durch Kommas getrennte Werte in einem Pandas-DataFrame in separate Zeilen auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn