Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk menyahsarang Lajur DataFrame Pandas menjadi Berbilang Baris?
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!