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
Barbara Streisandasal
2024-12-20 22:58:14901semak imbas

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]

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!

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