Saya memiliki bingkai data panda (X11) seperti ini: Sebenarnya saya memiliki 99 kolom hingga dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Saya ingin membuat kolom tambahan untuk nilai sel seperti 25041.40391.5856 dll. Jadi akan ada kolom 25041 dengan nilai 1 atau 0 jika 25041 terjadi di baris tertentu di setiap kolom dxs. Saya menggunakan kode ini dan berfungsi ketika jumlah baris lebih sedikit.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Saya mendapatkan hasil seperti ini:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Ketika jumlah baris ribuan atau jutaan, itu hang dan memakan waktu selamanya dan saya tidak mendapatkan hasil apa pun. Harap lihat bahwa nilai sel tidak unik untuk kolom, alih-alih diulang dalam multi kolom. Sebagai contoh, 40391 terjadi di dx1 dan juga di dx2 dan seterusnya untuk 0 dan 5856 dll. Adakah cara untuk meningkatkan logika yang disebutkan di atas?
sumber
Jawaban:
Ada solusi pythonic yang jauh lebih banyak di panda ...
Ini membutuhkan waktu kurang dari satu detik pada 10 Juta baris di laptop saya:
Berikut detailnya:
Kerangka data kecil sederhana -
Metode binarisasi -
Bingkai data dengan 10 Juta baris -
Binarisasi waktu (alias penyandian satu panas) pada 10 juta baris data -
Semoga ini membantu!
sumber
Sepertinya Anda ingin membuat variabel dummy dari kolom dataframe panda. Untungnya, panda memiliki metode khusus untuk itu:
get_dummies()
. Berikut ini cuplikan kode yang dapat Anda sesuaikan untuk kebutuhan Anda:Ini adalah output dari
data_transformed
:sumber