Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk menyahsarang Lajur DataFrame Pandas menjadi Berbilang Baris?

Bagaimana untuk menyahsarang Lajur DataFrame Pandas menjadi Berbilang Baris?

Susan Sarandon
Susan Sarandonasal
2024-12-21 00:47:09555semak imbas

How to Unnest a Pandas DataFrame Column into Multiple Rows?

Cara Menyahsarang Lajur menjadi Berbilang Baris dalam Bingkai Data Pandas

Masalah:

Anda mempunyai DataFrame di mana satu lajur mengandungi senarai nilai dan anda ingin memisahkan setiap elemen senarai ke dalamnya baris sendiri.

Penyelesaian:

Terdapat beberapa kaedah untuk menyahsarang (atau meletupkan) lajur dalam Pandas DataFrame:

Kaedah 1: Menggunakan letupan (Panda >= 0.25)

Jika anda mempunyai satu lajur untuk dinyahsarang, fungsi letupan ialah penyelesaian paling mudah:

df.explode('B')

Kaedah 2: Menggunakan apply dan pd.Series

Kaedah ini mudah tetapi tidak disyorkan untuk prestasi sebab:

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})

Kaedah 3: Menggunakan pengulangan dan Pembina DataFrame

Buat DataFrame baharu dengan nilai berulang dalam lajur tidak bersarang:

df=pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})

Kaedah 4: Menggunakan indeks semula atau loc

Buat DataFrame baharu dengan nilai yang tidak bersarang dan gunakan indeks semula atau loc untuk menyelaraskannya dengan asal:

df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))

Kaedah 5: Menggunakan koleksi.ChainMap ( apabila senarai mengandungi unik nilai)

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
pd.DataFrame(list(d.items()),columns=df.columns[::-1])

Kaedah 6: Menggunakan Numpy untuk Prestasi Tinggi

Kaedah ini lebih cekap daripada yang sebelumnya:

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)

Kaedah 7: Menggunakan itertools.cycle dan itertools.chain

Penyelesaian Python tulen untuk keseronokan:

from itertools import cycle,chain
l=df.values.tolist()
l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l]
pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)

Mengerti kepada Berbilang Lajur:

Fungsi berikut membolehkan anda untuk unnest berbilang lajur dalam a DataFrame:

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

Column-wise Unnesting:

Jika anda perlu membuka sarang lajur secara mendatar, gunakan kaedah add_prefix bagi pembina DataFrame:

df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))

Atas ialah kandungan terperinci Bagaimana untuk menyahsarang Lajur DataFrame Pandas menjadi Berbilang Baris?. 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