Uji Chi-Square digunakan untuk membandingkan distribusi dua variabel kategori dari sampel yang sama atau dari sampel yang berbeda. Tes dilakukan dengan menggunakan jumlah pengamatan yang mutlak, bukan persentase pengamatan
Ini adalah pengantar tipe data kategori panda, termasuk perbandingan singkat dengan R
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object3
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object4 adalah tipe data panda yang sesuai dengan variabel kategori dalam statistik. Sebuah variabel kategori mengambil jumlah nilai yang mungkin terbatas, dan biasanya tetap, [
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5;
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object6 dalam R]. Contohnya adalah jenis kelamin, kelas sosial, golongan darah, afiliasi negara, waktu pengamatan atau penilaian melalui skala Likert
Berbeda dengan variabel kategori statistik, data kategori mungkin memiliki urutan [mis. g. 'sangat setuju' vs 'setuju' atau 'pengamatan pertama' vs. 'pengamatan kedua'], tetapi operasi numerik [penambahan, pembagian, ...] tidak dimungkinkan
Semua nilai data kategorikal ada di
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 atau
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object8. Urutan ditentukan oleh urutan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5, bukan urutan leksikal dari nilai-nilai. Secara internal, struktur data terdiri dari array
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 dan array integer
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']1 yang menunjuk ke nilai sebenarnya dalam array
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5
Tipe data kategori berguna dalam kasus berikut
Sebuah variabel string yang hanya terdiri dari beberapa nilai yang berbeda. Mengubah variabel string seperti itu menjadi variabel kategorikal akan menghemat sebagian memori, lihat
Urutan leksikal suatu variabel tidak sama dengan urutan logis ["satu", "dua", "tiga"]. Dengan mengonversi ke kategorikal dan menentukan urutan pada kategori, pengurutan dan min/maks akan menggunakan urutan logis alih-alih urutan leksikal, lihat
Sebagai sinyal ke pustaka Python lain bahwa kolom ini harus diperlakukan sebagai variabel kategori [mis. g. untuk menggunakan metode statistik atau tipe plot yang sesuai]
Lihat juga
Pembuatan objek
Pembuatan seri
Kategori
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 atau kolom dalam
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 dapat dibuat dengan beberapa cara
Dengan menentukan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_5 saat membuat
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3
In [1]: s = pd.Series[["a", "b", "c", "a"], dtype="category"] In [2]: s Out[2]: 0 a 1 b 2 c 3 a dtype: category Categories [3, object]: ['a', 'b', 'c']
Dengan mengonversi
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 atau kolom yang ada menjadi tipe
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
Dengan menggunakan fungsi khusus, seperti , yang mengelompokkan data ke dalam bin diskrit. Lihat di dokumen
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9
Dengan meneruskan objek ke
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 atau menugaskannya ke
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN
Data kategori memiliki
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 spesifik
In [16]: df.dtypes Out[16]: A object B category dtype: object
pembuatan DataFrame
Mirip dengan bagian sebelumnya di mana satu kolom diubah menjadi kategorikal, semua kolom dalam
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 dapat dikonversi menjadi kategorikal baik selama atau setelah konstruksi
Ini dapat dilakukan selama konstruksi dengan menentukan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']5 di
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 konstruktor
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object
Perhatikan bahwa kategori yang ada di setiap kolom berbeda;
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']
Secara analog, semua kolom dalam
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 yang ada dapat dikonversi secara batch menggunakan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
Konversi ini juga dilakukan kolom demi kolom
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_
Mengontrol perilaku
Dalam contoh di atas di mana kami melewati
In [26]: from pandas.api.types import CategoricalDtype In [27]: s = pd.Series[["a", "b", "c", "a"]] In [28]: cat_type = CategoricalDtype[categories=["b", "c", "d"], ordered=True] In [29]: s_cat = s.astype[cat_type] In [30]: s_cat Out[30]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b' < 'c' < 'd']_9, kami menggunakan perilaku default
Kategori disimpulkan dari data
Kategori tidak diurutkan
Untuk mengontrol perilaku tersebut, alih-alih meneruskan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a00, gunakan instance
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a01
In [26]: from pandas.api.types import CategoricalDtype In [27]: s = pd.Series[["a", "b", "c", "a"]] In [28]: cat_type = CategoricalDtype[categories=["b", "c", "d"], ordered=True] In [29]: s_cat = s.astype[cat_type] In [30]: s_cat Out[30]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b' < 'c' < 'd']
Demikian pula,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_01 dapat digunakan dengan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 untuk memastikan bahwa kategori konsisten di antara semua kolom
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a0
Catatan
Untuk melakukan konversi berdasarkan tabel, di mana semua label di seluruh
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 digunakan sebagai kategori untuk setiap kolom, parameter
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 dapat ditentukan secara terprogram dengan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a06
Jika Anda sudah memiliki
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']1 dan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5, Anda dapat menggunakan konstruktor untuk menyimpan langkah pemfaktoran selama mode konstruktor normal
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a1
Mendapatkan kembali data asli
Untuk kembali ke larik
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 atau NumPy asli, gunakan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a11 atau
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a12
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a2
Catatan
Berbeda dengan fungsi
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object3 R, data kategorikal tidak mengubah nilai input menjadi string;
Catatan
Berbeda dengan fungsi
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_3 R, saat ini tidak ada cara untuk menetapkan/mengubah label pada waktu pembuatan. Gunakan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_5 untuk mengubah kategori setelah waktu pembuatan
TipeD Kategorikal
Jenis kategori sepenuhnya dijelaskan oleh
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
5. urutan nilai unik dan tidak ada nilai yang hilangIn [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
_17. boolean
Informasi ini dapat disimpan dalam
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_01. Argumen
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 adalah opsional, yang menyiratkan bahwa kategori aktual harus disimpulkan dari apa pun yang ada dalam data saat dibuat. Kategori diasumsikan tidak terurut secara default
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a3
A
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_01 dapat digunakan di mana saja panda mengharapkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a22. Misalnya , , atau dalam konstruktor
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3
Catatan
Demi kenyamanan, Anda dapat menggunakan string
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a00 sebagai ganti
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a01 saat Anda menginginkan perilaku default dari kategori tidak diurutkan, dan sama dengan nilai yang ditetapkan yang ada dalam larik. Dengan kata lain,
In [26]: from pandas.api.types import CategoricalDtype In [27]: s = pd.Series[["a", "b", "c", "a"]] In [28]: cat_type = CategoricalDtype[categories=["b", "c", "d"], ordered=True] In [29]: s_cat = s.astype[cat_type] In [30]: s_cat Out[30]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b' < 'c' < 'd']_9 setara dengan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a29
semantik kesetaraan
Dua contoh
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_01 membandingkan sama setiap kali mereka memiliki kategori dan urutan yang sama. Saat membandingkan dua kategori tak terurut, urutan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 tidak dipertimbangkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_4
Semua contoh
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_01 bandingkan sama dengan string
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a00
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a5
Peringatan
Karena
In [26]: from pandas.api.types import CategoricalDtype In [27]: s = pd.Series[["a", "b", "c", "a"]] In [28]: cat_type = CategoricalDtype[categories=["b", "c", "d"], ordered=True] In [29]: s_cat = s.astype[cat_type] In [30]: s_cat Out[30]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b' < 'c' < 'd']_9 pada dasarnya adalah
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a35, dan karena semua contoh
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a01 dibandingkan sama dengan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a00, semua contoh
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a01 dibandingkan sama dengan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a35, terlepas dari
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 atau ________17______17
Keterangan
Menggunakan data kategorikal akan menghasilkan output yang mirip dengan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 atau
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 dari tipe
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a45
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a6
Bekerja dengan kategori
Data kategorikal memiliki properti
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 dan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a17, yang mencantumkan kemungkinan nilainya dan apakah urutannya penting atau tidak. Properti ini diekspos sebagai
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a48 dan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a49. Jika Anda tidak menentukan kategori dan pengurutan secara manual, mereka disimpulkan dari argumen yang diteruskan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a7
Dimungkinkan juga untuk meneruskan kategori dalam urutan tertentu
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a8
Catatan
Data kategorikal baru tidak diurutkan secara otomatis. Anda harus secara eksplisit memberikan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_50 untuk menunjukkan urutan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51
Catatan
Hasil dari tidak selalu sama dengan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a53, karena
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a54 memiliki beberapa jaminan, yaitu mengembalikan kategori dalam urutan tampilan, dan hanya menyertakan nilai yang benar-benar ada
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_9
Mengganti nama kategori
Mengganti nama kategori dilakukan dengan menggunakan metode
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a55
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_0
Catatan
Berbeda dengan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object3 R, data kategorikal dapat memiliki kategori jenis lain selain string
Catatan
Ketahuilah bahwa menetapkan kategori baru adalah operasi di tempat, sementara sebagian besar operasi lain di bawah
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a57 per default mengembalikan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 baru dari dtype
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8
Kategori harus unik atau
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_60 dimunculkan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_1
Kategori juga tidak boleh
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_61 atau
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a60 dinaikkan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_2
Menambahkan kategori baru
Menambahkan kategori dapat dilakukan dengan menggunakan metode
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a63
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_3
Menghapus kategori
Menghapus kategori dapat dilakukan dengan menggunakan metode
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a64. Nilai yang dihapus diganti dengan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object8
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_4
Menghapus kategori yang tidak digunakan
Menghapus kategori yang tidak terpakai juga bisa dilakukan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_5
Menetapkan kategori
Jika Anda ingin menghapus dan menambahkan kategori baru dalam satu langkah [yang memiliki keunggulan kecepatan tertentu], atau cukup menyetel kategori ke skala yang telah ditentukan sebelumnya, gunakan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a66
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_6
Catatan
Ketahuilah bahwa
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_67 tidak dapat mengetahui apakah beberapa kategori dihilangkan dengan sengaja atau karena salah eja atau [di bawah Python3] karena perbedaan jenis [e. g. , NumPy S1 dtype dan string Python]. Ini dapat menghasilkan perilaku yang mengejutkan
Menyortir dan memesan
Jika data kategori diurutkan [
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a68], maka urutan kategori memiliki arti dan operasi tertentu dimungkinkan. Jika kategori tidak terurut,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a69 akan menaikkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a70
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_7
Anda dapat mengatur data kategori untuk diurutkan dengan menggunakan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a71 atau tidak diurutkan dengan menggunakan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a72. Ini secara default akan mengembalikan objek baru
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_8
Penyortiran akan menggunakan urutan yang ditentukan oleh kategori, bukan urutan leksikal yang ada pada tipe data. Ini bahkan berlaku untuk string dan data numerik
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_9
Menyusun ulang
Penyusunan ulang kategori dimungkinkan melalui metode
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a73 dan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a67. Untuk
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_73, semua kategori lama harus dimasukkan ke dalam kategori baru dan kategori baru tidak diperbolehkan. Ini tentu akan membuat urutan sortir sama dengan urutan kategori
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN0
Catatan
Perhatikan perbedaan antara menetapkan kategori baru dan menyusun ulang kategori. yang pertama mengganti nama kategori dan karenanya nilai individual di
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3, tetapi jika posisi pertama diurutkan terakhir, nilai yang diubah namanya akan tetap diurutkan terakhir. Pengurutan ulang berarti bahwa cara mengurutkan nilai berbeda setelahnya, tetapi nilai individual dalam
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 tidak berubah
Catatan
Jika
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_51 tidak dipesan, dan akan menaikkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a70. Operasi numerik seperti
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a82,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a83,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a84,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a85 dan operasi berdasarkan mereka [e. g. , yang perlu menghitung rata-rata antara dua nilai jika panjang array genap] tidak berfungsi dan menaikkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a70
Penyortiran multi kolom
Kolom dtyped kategorikal akan berpartisipasi dalam pengurutan multi-kolom dengan cara yang mirip dengan kolom lainnya. Urutan kategori ditentukan oleh
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 kolom itu
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN1
Menyusun ulang
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_5 mengubah jenis masa depan
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN2
Perbandingan
Membandingkan data kategorikal dengan objek lain dimungkinkan dalam tiga kasus
Membandingkan kesetaraan [
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
90 danIn [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
91] dengan objek seperti daftar [daftar, Seri, larik, …] dengan panjang yang sama dengan data kategorikalSemua perbandingan [
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
90,In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
91,In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
94,In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
95,In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
96, danIn [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
97] dari data kategori ke Seri kategori lain, ketikaIn [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
98 danIn [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
5 samaSemua perbandingan data kategorikal dengan skalar
Semua perbandingan lainnya, terutama perbandingan "non-kesetaraan" dari dua kategori dengan kategori yang berbeda atau kategori dengan objek seperti daftar, akan meningkatkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a70
Catatan
Setiap perbandingan "non-kesetaraan" dari data kategorikal dengan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3,
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 902,
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 903 atau data kategorikal dengan kategori atau pengurutan yang berbeda akan meningkatkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a70 karena pengurutan kategori khusus dapat ditafsirkan dalam dua cara. satu dengan memperhitungkan pemesanan dan satu tanpa
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN3
Membandingkan dengan kategorikal dengan kategori dan urutan yang sama atau dengan karya skalar
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN4
Perbandingan kesetaraan bekerja dengan objek seperti daftar dengan panjang dan skalar yang sama
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN5
Ini tidak berfungsi karena kategorinya tidak sama
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN6
Jika Anda ingin melakukan perbandingan "non-kesetaraan" dari seri kategori dengan objek seperti daftar yang bukan data kategori, Anda harus eksplisit dan mengonversi data kategori kembali ke nilai aslinya
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN7
Saat Anda membandingkan dua kategori yang tidak diurutkan dengan kategori yang sama, urutannya tidak dipertimbangkan
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN8
Operasi
Selain , dan , operasi berikut dimungkinkan dengan data kategorikal
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 metode seperti akan menggunakan semua kategori, bahkan jika beberapa kategori tidak ada dalam data
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN_9
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_4 metode seperti juga menunjukkan kategori "tidak terpakai".
In [16]: df.dtypes Out[16]: A object B category dtype: object0
Groupby juga akan menampilkan kategori "tidak terpakai".
In [16]: df.dtypes Out[16]: A object B category dtype: object_1
Tabel pivot
In [16]: df.dtypes Out[16]: A object B category dtype: object_2
Pengurangan data
Metode akses data panda yang dioptimalkan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 912,
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 913,
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 914, dan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 915, berfungsi seperti biasa. Satu-satunya perbedaan adalah jenis pengembalian [untuk mendapatkan] dan hanya nilai yang sudah ada di
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 yang dapat ditetapkan
Mendapatkan
Jika operasi pemotongan mengembalikan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4 atau kolom bertipe
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3, tipe d
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 dipertahankan
In [16]: df.dtypes Out[16]: A object B category dtype: object_3
Contoh di mana jenis kategori tidak dipertahankan adalah jika Anda mengambil satu baris.
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 yang dihasilkan adalah tipe
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 921
In [16]: df.dtypes Out[16]: A object B category dtype: object_4
Mengembalikan satu item dari data kategorikal juga akan mengembalikan nilai, bukan kategori dengan panjang "1"
In [16]: df.dtypes Out[16]: A object B category dtype: object_5
Catatan
Berbeda dengan fungsi
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object3 R, di mana
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 923 mengembalikan nilai tunggal
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object3
Untuk mendapatkan nilai tunggal
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 bertipe
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8, Anda memasukkan daftar dengan satu nilai
In [16]: df.dtypes Out[16]: A object B category dtype: object_6
Pengakses string dan datetime
Pengakses
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 927 dan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 928 akan berfungsi jika
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a48 adalah jenis yang sesuai
In [16]: df.dtypes Out[16]: A object B category dtype: object_7
Catatan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 [atau
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4] yang dikembalikan memiliki jenis yang sama seperti jika Anda menggunakan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 932 /
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 933 pada
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 dari jenis tersebut [dan bukan dari jenis
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8. ]
Artinya, nilai yang dikembalikan dari metode dan properti pada pengakses
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 dan nilai yang dikembalikan dari metode dan properti pada pengakses
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 ini diubah menjadi salah satu tipe
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 akan sama
In [16]: df.dtypes Out[16]: A object B category dtype: object_8
Catatan
Pekerjaan dilakukan pada
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 dan kemudian
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 baru dibangun. Ini memiliki beberapa implikasi kinerja jika Anda memiliki
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 tipe string, di mana banyak elemen diulang [i. e. jumlah elemen unik di
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 jauh lebih kecil dari panjang
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3]. Dalam hal ini akan lebih cepat untuk mengonversi
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 asli ke salah satu jenis
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 dan menggunakan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 932 atau
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 947 pada itu
Pengaturan
Menetapkan nilai dalam kolom kategorikal [atau
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3] berfungsi selama nilai disertakan dalam
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5
In [16]: df.dtypes Out[16]: A object B category dtype: object_9
Menetapkan nilai dengan menetapkan data kategorikal juga akan memeriksa apakah
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 cocok
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_0
Menetapkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51 ke bagian kolom jenis lain akan menggunakan nilai
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_1
Penggabungan / Penggabungan
Secara default, menggabungkan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 atau
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 953 yang berisi kategori yang sama menghasilkan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 dtype, jika tidak, hasil akan tergantung pada dtype dari kategori yang mendasarinya. Penggabungan yang menghasilkan tipe non-kategori kemungkinan akan memiliki penggunaan memori yang lebih tinggi. Gunakan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_55 atau
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 956 untuk memastikan hasil
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_2
Tabel berikut merangkum hasil penggabungan
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object4
argumen1
arg2
identik
hasil
kategori
kategori
BENAR
kategori
kategori [objek]
kategori [objek]
PALSU
objek [dtype disimpulkan]
kategori [int]
kategori [melayang]
PALSU
float [dtype disimpulkan]
Lihat juga bagian untuk catatan tentang mempertahankan tipe dan kinerja gabungan
Berserikat
Jika Anda ingin menggabungkan kategorikal yang belum tentu memiliki kategori yang sama, fungsi akan menggabungkan daftar seperti kategorikal. Kategori baru akan menjadi gabungan dari kategori yang digabungkan
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_3
Secara default, kategori yang dihasilkan akan diurutkan saat muncul di data. Jika Anda ingin kategori disortir, gunakan argumen
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 960
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_4
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_56 juga bekerja dengan kasus "mudah" menggabungkan dua kategori dari kategori yang sama dan memesan informasi [e. g. apa yang Anda juga bisa
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_62 untuk]
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_5
Di bawah ini memunculkan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_70 karena kategorinya dipesan dan tidak identik
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_6
Kategorikal terurut dengan kategori berbeda atau pengurutan dapat digabungkan dengan menggunakan argumen
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 964
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_7
juga berfungsi dengan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 966, atau
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 yang berisi data kategori, tetapi perhatikan bahwa larik yang dihasilkan akan selalu berupa
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_8
Catatan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_56 dapat mengode ulang kode bilangan bulat untuk kategori saat menggabungkan kategorikal. Ini mungkin yang Anda inginkan, tetapi jika Anda mengandalkan penomoran kategori yang tepat, berhati-hatilah
In [17]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}, dtype="category"] In [18]: df.dtypes Out[18]: A category B category dtype: object_9
Mendapatkan data masuk/keluar
Anda dapat menulis data yang berisi
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 dtypes ke
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_71. Lihat untuk contoh dan peringatan
Dimungkinkan juga untuk menulis data ke dan membaca data dari file format Stata. Lihat untuk contoh dan peringatan
Menulis ke file CSV akan mengonversi data, secara efektif menghapus informasi apa pun tentang kategorikal [kategori dan pemesanan]. Jadi, jika Anda membaca kembali file CSV, Anda harus mengonversi kolom yang relevan kembali ke
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 dan menetapkan kategori dan urutan kategori yang tepat
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']0
Hal yang sama berlaku untuk menulis ke database SQL dengan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 973
Data hilang
panda terutama menggunakan nilai
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_8 untuk mewakili data yang hilang. Ini secara default tidak termasuk dalam perhitungan. Lihat
Nilai yang hilang tidak boleh disertakan dalam
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object5 Kategorikal, hanya dalam
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 976. Sebaliknya, dipahami bahwa NaN berbeda, dan selalu ada kemungkinan. Saat bekerja dengan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']1 Kategorikal, nilai yang hilang akan selalu memiliki kode
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 978
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']1
Metode untuk bekerja dengan data yang hilang, e. g. , , , semua berfungsi normal
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']2
Perbedaan dengan R In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}]
In [22]: df_cat = df.astype["category"]
In [23]: df_cat.dtypes
Out[23]:
A category
B category
dtype: object
3
Perbedaan fungsi faktor R berikut dapat diamati
R
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
6 diberi namaIn [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
5In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
6 R selalu bertipe string, sementaraIn [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
5 di panda bisa bertipe apa sajaTidak mungkin menentukan label pada waktu pembuatan. Gunakan
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9
_87 sesudahnyaBerbeda dengan fungsi
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
3 R, menggunakan data kategori sebagai satu-satunya input untuk membuat seri kategori baru tidak akan menghapus kategori yang tidak digunakan tetapi membuat seri kategori baru yang sama dengan yang diteruskan dalam satuR memungkinkan nilai yang hilang untuk dimasukkan ke dalam
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
6 [pandaIn [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object
5]. panda tidak mengizinkanIn [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a
_61 kategori, tetapi nilai yang hilang masih bisa berada diIn [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9
76
Gotcha
penggunaan memori
Penggunaan memori
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_51 sebanding dengan jumlah kategori ditambah panjang data. Sebaliknya, tipe
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_21 adalah konstanta dikalikan panjang data
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3
Catatan
Jika jumlah kategori mendekati panjang data,
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51 akan menggunakan memori yang hampir sama atau lebih banyak daripada representasi dtype
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 921 yang setara
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']4
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}]
In [4]: df["B"] = df["A"].astype["category"]
In [5]: df
Out[5]:
A B
0 a a
1 b b
2 c c
3 a a
51 bukan larik In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}]
In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]]
In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels]
In [9]: df.head[10]
Out[9]:
value group
0 65 60 - 69
1 49 40 - 49
2 56 50 - 59
3 43 40 - 49
4 43 40 - 49
5 91 90 - 99
6 32 30 - 39
7 87 80 - 89
8 36 30 - 39
9 8 0 - 9
98
Saat ini, data kategorikal dan
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51 yang mendasarinya diimplementasikan sebagai objek Python dan bukan sebagai tipe array NumPy level rendah. Hal ini menyebabkan beberapa masalah
NumPy sendiri tidak tahu tentang
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a22 yang baru
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']5
Perbandingan Dtype berfungsi
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']6
Untuk memeriksa apakah Seri berisi data Kategorikal, gunakan
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN01
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']7
Menggunakan fungsi NumPy pada
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 bertipe
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8 seharusnya tidak berfungsi karena
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object4 bukan data numerik [meskipun
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN05 adalah numerik]
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']8
Catatan
Jika fungsi seperti itu berfungsi, harap laporkan bug di https. //github. com/pandas-dev/pandas
dtype di apply
pandas saat ini tidak mempertahankan dtype dalam fungsi penerapan. Jika Anda menerapkan sepanjang baris Anda mendapatkan
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 dari
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 921
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a22 [sama seperti mendapatkan baris -> mendapatkan satu elemen akan mengembalikan tipe dasar] dan menerapkan sepanjang kolom juga akan dikonversi menjadi objek.
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a61 nilai tidak terpengaruh. Anda dapat menggunakan
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN10 untuk menangani nilai yang hilang sebelum menerapkan suatu fungsi
In [19]: df["A"] Out[19]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [20]: df["B"] Out[20]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_9
Indeks kategoris
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 9_66 adalah jenis indeks yang berguna untuk mendukung pengindeksan dengan duplikat. Ini adalah wadah di sekitar
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a_51 dan memungkinkan pengindeksan dan penyimpanan indeks yang efisien dengan sejumlah besar elemen duplikat. Lihat untuk penjelasan lebih rinci
Mengatur indeks akan membuat
In [6]: df = pd.DataFrame[{"value": np.random.randint[0, 100, 20]}] In [7]: labels = ["{0} - {1}".format[i, i + 9] for i in range[0, 100, 10]] In [8]: df["group"] = pd.cut[df.value, range[0, 105, 10], right=False, labels=labels] In [9]: df.head[10] Out[9]: value group 0 65 60 - 69 1 49 40 - 49 2 56 50 - 59 3 43 40 - 49 4 43 40 - 49 5 91 90 - 99 6 32 30 - 39 7 87 80 - 89 8 36 30 - 39 9 8 0 - 966
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object0
Efek samping
Membangun
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']3 dari
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51 tidak akan menyalin input
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51. Ini berarti bahwa perubahan pada
In [24]: df_cat["A"] Out[24]: 0 a 1 b 2 c 3 a Name: A, dtype: category Categories [3, object]: ['a', 'b', 'c'] In [25]: df_cat["B"] Out[25]: 0 b 1 c 2 c 3 d Name: B, dtype: category Categories [3, object]: ['b', 'c', 'd']_3 dalam banyak kasus akan mengubah
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51 asli
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_1
Gunakan
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN_19 untuk mencegah perilaku seperti itu atau jangan gunakan kembali
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object4
In [21]: df = pd.DataFrame[{"A": list["abca"], "B": list["bccd"]}] In [22]: df_cat = df.astype["category"] In [23]: df_cat.dtypes Out[23]: A category B category dtype: object_2
Catatan
Ini juga terjadi dalam beberapa kasus ketika Anda menyediakan larik NumPy alih-alih
In [3]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [4]: df["B"] = df["A"].astype["category"] In [5]: df Out[5]: A B 0 a a 1 b b 2 c c 3 a a51. menggunakan array int [mis. g.
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN22] akan menunjukkan perilaku yang sama, saat menggunakan larik string [mis. g.
In [10]: raw_cat = pd.Categorical[ ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ] ....: In [11]: s = pd.Series[raw_cat] In [12]: s Out[12]: 0 NaN 1 b 2 c 3 NaN dtype: category Categories [3, object]: ['b', 'c', 'd'] In [13]: df = pd.DataFrame[{"A": ["a", "b", "c", "a"]}] In [14]: df["B"] = raw_cat In [15]: df Out[15]: A B 0 a NaN 1 b b 2 c c 3 a NaN23] tidak akan