Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Menyahsarang Lajur yang Mengandungi Senarai dalam Pandas DataFrames?

Bagaimana untuk Menyahsarang Lajur yang Mengandungi Senarai dalam Pandas DataFrames?

Barbara Streisand
Lepaskan: 2024-12-20 22:58:14
asal
899 orang telah melayarinya

How to Unnest List-Containing Columns in 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]
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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'})
Salin selepas log masuk

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)})
Salin selepas log masuk

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))
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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')
Salin selepas log masuk

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_'))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan