Saya memiliki dua kerangka data panda:
from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})
Apa praktik terbaik untuk mendapatkan produk cartesian mereka (tentu saja tanpa menuliskannya secara eksplisit seperti saya)?
#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})
Gunakan
pd.MultiIndex.from_product
sebagai indeks dalam kerangka data yang kosong, lalu setel ulang indeksnya, dan selesai.di luar:
sumber
df1.col1
dandf.col2
).from_product
bisa digunakan untuk masalah ini.Ini tidak akan memenangkan kompetisi golf kode, dan meminjam dari jawaban sebelumnya - tetapi dengan jelas menunjukkan bagaimana kunci ditambahkan, dan bagaimana gabungan bekerja. Ini membuat 2 bingkai data baru dari daftar, lalu menambahkan kunci untuk menjalankan produk kartesius.
Kasus penggunaan saya adalah bahwa saya memerlukan daftar semua ID toko untuk setiap minggu dalam daftar saya. Jadi, saya membuat daftar semua minggu yang saya inginkan, lalu daftar semua ID toko yang ingin saya petakan.
Penggabungan yang saya pilih kiri, tetapi secara semantik sama dengan bagian dalam dalam pengaturan ini. Anda dapat melihat ini di dokumentasi tentang penggabungan , yang menyatakan bahwa itu adalah produk Cartesian jika kombinasi tombol muncul lebih dari sekali di kedua tabel - itulah yang kami siapkan.
sumber
days_and_stores = pd.merge(days.assign(key=0), stores.assign(key=0), on='key').drop('key', axis=1)
Kode minimal yang dibutuhkan untuk yang satu ini. Buat 'kunci' umum untuk menggabungkan keduanya:
sumber
df_cartesian = df_cartesian.drop(columns=['key'])
untuk membersihkan di akhirDengan metode perangkaian:
sumber
Sebagai alternatif, seseorang dapat mengandalkan produk cartesian yang disediakan oleh itertools:,
itertools.product
yang menghindari pembuatan kunci sementara atau modifikasi indeks:Tes cepat:
sumber
Jika Anda tidak memiliki kolom yang tumpang tindih, tidak ingin menambahkannya, dan indeks bingkai data dapat dibuang, ini mungkin lebih mudah:
sumber
TypeError: '<class 'pandas.core.index.Int64Index'>' does not support mutable operations.
Saya bisa menyiasati ini dengan menambahkan, index=[0,0]
ke definisi kerangka data.df1 = df1.set_index([[0]*len(df1)]))
(dan juga untukdf2
).Berikut adalah fungsi pembantu untuk melakukan produk Cartesian sederhana dengan dua bingkai data. Logika internal menangani menggunakan kunci internal, dan menghindari merusak kolom apa pun yang kebetulan bernama "kunci" dari kedua sisi.
acara:
sumber
Anda bisa mulai dengan mengambil produk Kartesius dari
df1.col1
dandf2.col3
, kemudian menggabungkan kembalidf1
untuk mendapatkancol2
.Berikut adalah fungsi produk Cartesian umum yang mengambil kamus daftar:
Lamar sebagai:
sumber
Anda bisa menggunakan numpy karena bisa lebih cepat. Misalkan Anda memiliki dua rangkaian sebagai berikut,
Anda hanya perlu,
sumber
Saya menemukan menggunakan pandas MultiIndex sebagai alat terbaik untuk pekerjaan itu. Jika Anda memiliki daftar daftar
lists_list
, panggilpd.MultiIndex.from_product(lists_list)
dan ulangi hasilnya (atau gunakan dalam indeks DataFrame).sumber