通常實(shí)時(shí)的數(shù)據(jù)包括重復(fù)的文本列。例如:性別,國(guó)家和代碼等特征總是重復(fù)的。這些是分類(lèi)數(shù)據(jù)的例子。
分類(lèi)變量只能采用有限的數(shù)量,而且通常是固定的數(shù)量。除了固定長(zhǎng)度,分類(lèi)數(shù)據(jù)可能有順序,但不能執(zhí)行數(shù)字操作。 分類(lèi)是Pandas數(shù)據(jù)類(lèi)型。
分類(lèi)數(shù)據(jù)類(lèi)型在以下情況下非常有用 -
"one","two","three")不同。 通過(guò)轉(zhuǎn)換為分類(lèi)并指定類(lèi)別上的順序,排序和最小/最大將使用邏輯順序,而不是詞法順序。plot類(lèi)型)。分類(lèi)對(duì)象可以通過(guò)多種方式創(chuàng)建。下面介紹了不同的方法 -
類(lèi)別/分類(lèi)
通過(guò)在pandas對(duì)象創(chuàng)建中將dtype指定為“category”。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print (s)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
傳遞給系列對(duì)象的元素?cái)?shù)量是四個(gè),但類(lèi)別只有三個(gè)。觀察相同的輸出類(lèi)別。
pd.Categorical
使用標(biāo)準(zhǔn)Pandas分類(lèi)構(gòu)造函數(shù),我們可以創(chuàng)建一個(gè)類(lèi)別對(duì)象。語(yǔ)法如下 -
pandas.Categorical(values, categories, ordered)
舉個(gè)例子 -
import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print (cat)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[a, b, c, a, b, c]
Categories (3, object): [a, b, c]
再舉一個(gè)例子 -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print (cat)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]
這里,第二個(gè)參數(shù)表示類(lèi)別。因此,在類(lèi)別中不存在的任何值將被視為NaN。
現(xiàn)在,看看下面的例子 -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print (cat)
執(zhí)行上面示例代碼,得到以結(jié)果 -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
從邏輯上講,排序(ordered)意味著,a大于b,b大于c。
描述
使用分類(lèi)數(shù)據(jù)上的.describe()命令,可以得到與類(lèi)型字符串的Series或DataFrame類(lèi)似的輸出。
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
print (df.describe())
print ("=============================")
print (df["cat"].describe())
執(zhí)行上面示例代碼,得到以下結(jié)果 -
cat s
count 3 3
unique 2 2
top c c
freq 2 2
=============================
count 3
unique 2
top c
freq 2
Name: cat, dtype: object
獲取類(lèi)別的屬性
obj.cat.categories命令用于獲取對(duì)象的類(lèi)別。
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (s.categories)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Index(['b', 'a', 'c'], dtype='object')
obj.ordered命令用于獲取對(duì)象的順序。
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (cat.ordered)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
False
該函數(shù)返回結(jié)果為:False,因?yàn)檫@里沒(méi)有指定任何順序。
重命名類(lèi)別
重命名類(lèi)別是通過(guò)將新值分配給series.cat.categories屬性來(lái)完成的。參考以下示例代碼 -
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print (s.cat.categories)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Index(['Group a', 'Group b', 'Group c'], dtype='object')
初始類(lèi)別[a,b,c]由對(duì)象的s.cat.categories屬性更新。
附加新類(lèi)別
使用Categorical.add.categories()方法,可以追加新的類(lèi)別。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print (s.cat.categories)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Index(['a', 'b', 'c', 4], dtype='object')
刪除類(lèi)別
使用Categorical.remove_categories()方法,可以刪除不需要的類(lèi)別。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print (s)
print("=====================================")
print ("After removal:")
print (s.cat.remove_categories("a"))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Original object:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
=====================================
After removal:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (2, object): [b, c]
分類(lèi)數(shù)據(jù)的比較
在三種情況下可以將分類(lèi)數(shù)據(jù)與其他對(duì)象進(jìn)行比較 -
==和!=)與類(lèi)別數(shù)據(jù)相同長(zhǎng)度的類(lèi)似列表的對(duì)象(列表,系列,數(shù)組…)進(jìn)行比較。ordered==True和類(lèi)別是相同時(shí),所有比較(==,!=,>,>=,<,和<=)分類(lèi)數(shù)據(jù)到另一個(gè)分類(lèi)系列。看看下面的例子 -
import pandas as pd
cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
print (cat>cat1)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
0 False
1 False
2 True
dtype: bool