Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Memisahkan Nilai Dipisahkan Koma dalam Pandas DataFrame kepada Baris Berasingan?

Bagaimana untuk Memisahkan Nilai Dipisahkan Koma dalam Pandas DataFrame kepada Baris Berasingan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-24 18:06:15272semak imbas

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

Pecah (Meletup) Kemasukan Rentetan Bingkai Data Panda untuk Mengasingkan Baris

Masalah:
Memanipulasi bingkai data Pandas mengandungi lajur nilai dipisahkan koma, matlamatnya adalah untuk memisahkan setiap medan CSV kepada baris individu, mengekalkan struktur data asal.

Penyelesaian:

Penyelesaian yang disyorkan ialah memanfaatkan kaedah Pandas Series.explode() atau DataFrame.explode(), diperkenalkan dalam Pandas 0.25.0 dan dipertingkatkan dalam Pandas 1.3.0 untuk menyokong berbilang lajur meletup.

Untuk meletupkan satu lajur, gunakan Series.explode():

df.explode('column_name')

Untuk berbilang lajur, gunakan DataFrame.explode():

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

Contoh:

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

df.explode('A')

Output:

     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]

Untuk pendekatan yang lebih generik yang berfungsi untuk berbilang lajur biasa dan senarai , pertimbangkan fungsi berikut:

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

Contoh meletup seperti CSV lajur:

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

Output:

  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

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Nilai Dipisahkan Koma dalam Pandas DataFrame kepada Baris Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn