Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Meletupkan Lajur Bingkai Data Pandas ke dalam Berbilang Baris?
Cara Menyahsarang (Meletupkan) Lajur dalam Bingkai Data Pandas, menjadi Berbilang Baris
Dalam Panda, meletup lajur melibatkan penukaran data daripada satu baris kepada berbilang baris . Ini berguna apabila anda mempunyai lajur yang mengandungi sel jenis senarai dan perlu membahagikannya kepada baris individu.
Pertimbangkan DataFrame dengan lajur 'B' yang mengandungi senarai:
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) Output: A B 0 1 [1, 2] 1 2 [1, 2]
Untuk meletupkan lajur 'B' ini, kami mempersembahkan pelbagai kaedah:
Kaedah 0 [Panda >= 0.25]
Bermula dari Pandas 0.25, jika anda perlu meletupkan hanya satu lajur, gunakan fungsi panda.DataFrame.explode:
df.explode('B') Output: A B 0 1 1 1 1 2 3 2 1 4 2 2
Kaedah 1
gunakan pd.Series (mudah difahami tetapi tidak disyorkan untuk prestasi):
df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
Kaedah 2
Menggunakan ulangan dengan pembina DataFrame:
df = pd.DataFrame({'A': df.A.repeat(df.B.str.len()), 'B': np.concatenate(df.B.values)})
Kaedah 3
Semula -mencipta senarai:
pd.DataFrame([[x] + [z] for x, y in df.values for z in y], columns=df.columns)
Kaedah 4
Menggunakan indeks semula atau loc:
df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
Kaedah 5
Apabila senarai mengandungi hanya nilai unik:
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:
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 kitaran dan rantai itertools:
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 mengendalikan berbilang lajur yang meletup, fungsi boleh ditakrifkan:
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') unnesting(df, ['B', 'C'])
Column-Wise Unnesting
Untuk mengembangkan senarai secara mendatar, gunakan pd.DataFrame constructor:
df.join(pd.DataFrame(df.B.tolist(), index=df.index).add_prefix('B_'))
Atas ialah kandungan terperinci Bagaimana untuk Meletupkan Lajur Bingkai Data Pandas ke dalam Berbilang Baris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!