Pandas分類數據
通常實時的數據包括重複的文本列。例如:性別,國家和代碼等特徵總是重複的。這些是分類數據的例子。
分類變量只能採用有限的數量,而且通常是固定的數量。除了固定長度,分類數據可能有順序,但不能執行數字操作。 分類是Pandas數據類型。
分類數據類型在以下情況下非常有用 -
- 一個字符串變量,只包含幾個不同的值。將這樣的字符串變量轉換爲分類變量將會節省一些內存。
- 變量的詞彙順序與邏輯順序(
"one"
,"two"
,"three"
)不同。 通過轉換爲分類並指定類別上的順序,排序和最小/最大將使用邏輯順序,而不是詞法順序。 - 作爲其他python庫的一個信號,這個列應該被當作一個分類變量(例如,使用合適的統計方法或
plot
類型)。
對象創建
分類對象可以通過多種方式創建。下面介紹了不同的方法 -
類別/分類
通過在pandas
對象創建中將dtype
指定爲「category」
。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print (s)
執行上面示例代碼,得到以下結果 -
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
傳遞給系列對象的元素數量是四個,但類別只有三個。觀察相同的輸出類別。
pd.Categorical
使用標準Pandas分類構造函數,我們可以創建一個類別對象。語法如下 -
pandas.Categorical(values, categories, ordered)
舉個例子 -
import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print (cat)
執行上面示例代碼,得到以下結果 -
[a, b, c, a, b, c]
Categories (3, object): [a, b, c]
再舉一個例子 -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print (cat)
執行上面示例代碼,得到以下結果 -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]
這裏,第二個參數表示類別。因此,在類別中不存在的任何值將被視爲NaN
。
現在,看看下面的例子 -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print (cat)
執行上面示例代碼,得到以結果 -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
從邏輯上講,排序(ordered)意味着,a
大於b
,b
大於c
。
描述
使用分類數據上的.describe()
命令,可以得到與類型字符串的Series或DataFrame類似的輸出。
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())
執行上面示例代碼,得到以下結果 -
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
獲取類別的屬性
obj.cat.categories
命令用於獲取對象的類別。
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (s.categories)
執行上面示例代碼,得到以下結果 -
Index(['b', 'a', 'c'], dtype='object')
obj.ordered命令用於獲取對象的順序。
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (cat.ordered)
執行上面示例代碼,得到以下結果 -
False
該函數返回結果爲:False,因爲這裏沒有指定任何順序。
重命名類別
重命名類別是通過將新值分配給series.cat.categories
屬性來完成的。參考以下示例代碼 -
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)
執行上面示例代碼,得到以下結果 -
Index(['Group a', 'Group b', 'Group c'], dtype='object')
初始類別[a,b,c]
由對象的s.cat.categories
屬性更新。
附加新類別
使用Categorical.add.categories()
方法,可以追加新的類別。
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print (s.cat.categories)
執行上面示例代碼,得到以下結果 -
Index(['a', 'b', 'c', 4], dtype='object')
刪除類別
使用Categorical.remove_categories()
方法,可以刪除不需要的類別。
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"))
執行上面示例代碼,得到以下結果 -
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]
分類數據的比較
在三種情況下可以將分類數據與其他對象進行比較 -
- 將等號(
==
和!=
)與類別數據相同長度的類似列表的對象(列表,系列,數組…)進行比較。 - 當
ordered==True
和類別是相同時,所有比較(==
,!=
,>
,>=
,<
,和<=
)分類數據到另一個分類系列。 - 將分類數據與標量進行比較。
看看下面的例子 -
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)
執行上面示例代碼,得到以下結果 -
0 False
1 False
2 True
dtype: bool