Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menyahsarang Lajur yang Mengandungi Senarai dalam Pandas DataFrames?
Cara Menyahsarang (Meletupkan) Lajur dalam Bingkai Data Pandas, menjadi Berbilang Baris
Dalam panda, anda mungkin menghadapi situasi di mana lajur mengandungi senarai atau objek sebagai elemen. Untuk mengubah lajur sedemikian kepada baris individu, proses yang dikenali sebagai "tidak bersarang" atau "meletup" diperlukan. Ini membolehkan anda menggambarkan dan menganalisis data dengan lebih berkesan.
Masalah:
Pertimbangkan DataFrame di mana salah satu lajur, 'B', mengandungi senarai:
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) A B 0 1 [1, 2] 1 2 [1, 2]
Dijangka Output:
The output yang diingini ialah DataFrame di mana setiap elemen lajur 'B' diwakili sebagai baris yang berasingan:
A B 0 1 1 1 1 2 3 2 1 4 2 2
Penyelesaian:
Kaedah 1: Fungsi Letupan
Bermula dengan Pandas versi 0.25, anda boleh menggunakan fungsi panda.DataFrame.explode untuk unnesting. Fungsi ini meletupkan lajur tertentu dengan cekap, mencipta baris baharu untuk setiap elemen senarai.
df.explode('B') A B 0 1 1 1 1 2 0 2 1 1 2 2
Kaedah 2: Guna pd.Siri
Pendekatan lain ialah menggabungkan aplikasi fungsi dengan pd.Siri. Kaedah ini memproses setiap baris lajur 'B' dan membahagikan elemennya kepada objek Siri yang berasingan.
df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
Kaedah 3: Pembina DataFrame
Sebagai alternatif, anda boleh gunakan pembina DataFrame untuk membentuk semula data. Ini melibatkan pengulangan indeks baris untuk memadankan bilangan elemen dalam senarai dan menggabungkannya ke dalam satu lajur.
df = pd.DataFrame({'A':df.A.repeat(df.B.str.len()), 'B':np.concatenate(df.B.values)})
Kaedah 4: Indeks semula atau loc
Menggunakan indeks semula atau loc membolehkan anda mengembangkan DataFrame untuk menampung nilai yang meletup. Isikan nilai yang hilang dengan elemen dari lajur 'B'.
df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
Kaedah 5: Pemahaman Senarai
Kaedah ringkas melibatkan mencipta senarai senarai menggunakan senaraikan kefahaman dan kemudian tukarkan kepada a DataFrame.
pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns)
Kaedah 6: Numpy
Untuk senario intensif prestasi, numpy menawarkan operasi bervektor. Kaedah ini membentuk semula data menggunakan np.dstack dan mencipta DataFrame baharu.
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: Itertools
Menggunakan pakej itertools, anda boleh beralih melalui elemen dan menggabungkannya untuk mencipta yang baharu DataFrame.
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:
Untuk melanjutkan kaedah ini kepada berbilang lajur, anda boleh mentakrifkan fungsi tersuai yang mengambil nama lajur sebagai input dan melakukan operasi tidak bersarang.
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')
Bijak Lajur Tidak bersarang:
Jika anda ingin "menyahsarang" secara mendatar, bermakna mengembangkan elemen dalam satu baris, anda boleh menggunakan pembina DataFrame.
df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
Kesimpulan:
Kaedah ini menyediakan pilihan yang fleksibel untuk menyahsarang data dalam DataFrames panda. Pilih pendekatan yang paling sesuai dengan prestasi dan keperluan kebolehbacaan anda.
Atas ialah kandungan terperinci Bagaimana untuk Menyahsarang Lajur yang Mengandungi Senarai dalam Pandas DataFrames?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!