鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ Pandas分類數(shù)據(jù)
Pandas教程
Pandas注意事項&竅門
Pandas IO工具
Pandas重建索引
Pandas稀疏數(shù)據(jù)
Pandas時間差(Timedelta)
Pandas聚合
Pandas字符串和文本數(shù)據(jù)
Pandas分類數(shù)據(jù)
Pandas索引和選擇數(shù)據(jù)
Pandas基本功能
Pandas系列
Pandas數(shù)據(jù)幀(DataFrame)
Pandas日期功能
Pandas缺失數(shù)據(jù)
Pandas與SQL比較
Pandas迭代
Pandas合并/連接
Pandas選項和自定義
Pandas級聯(lián)
Pandas可視化
Pandas數(shù)據(jù)結(jié)構(gòu)
Pandas環(huán)境安裝配置
Pandas統(tǒng)計函數(shù)
Pandas窗口函數(shù)
Pandas面板(Panel)
Pandas排序
Pandas函數(shù)應(yīng)用
Pandas快速入門
Pandas描述性統(tǒng)計
Pandas分組(GroupBy)

Pandas分類數(shù)據(jù)

通常實時的數(shù)據(jù)包括重復(fù)的文本列。例如:性別,國家和代碼等特征總是重復(fù)的。這些是分類數(shù)據(jù)的例子。

分類變量只能采用有限的數(shù)量,而且通常是固定的數(shù)量。除了固定長度,分類數(shù)據(jù)可能有順序,但不能執(zhí)行數(shù)字操作。 分類是Pandas數(shù)據(jù)類型。

分類數(shù)據(jù)類型在以下情況下非常有用 -

  • 一個字符串變量,只包含幾個不同的值。將這樣的字符串變量轉(zhuǎn)換為分類變量將會節(jié)省一些內(nèi)存。
  • 變量的詞匯順序與邏輯順序("one","two","three")不同。 通過轉(zhuǎn)換為分類并指定類別上的順序,排序和最小/最大將使用邏輯順序,而不是詞法順序。
  • 作為其他python庫的一個信號,這個列應(yīng)該被當(dāng)作一個分類變量(例如,使用合適的統(tǒng)計方法或plot類型)。

對象創(chuàng)建

分類對象可以通過多種方式創(chuàng)建。下面介紹了不同的方法 -

類別/分類

通過在pandas對象創(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]

傳遞給系列對象的元素數(shù)量是四個,但類別只有三個。觀察相同的輸出類別。

pd.Categorical

使用標(biāo)準(zhǔn)Pandas分類構(gòu)造函數(shù),我們可以創(chuàng)建一個類別對象。語法如下 -

pandas.Categorical(values, categories, ordered)

舉個例子 -

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]

再舉一個例子 -

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]

這里,第二個參數(shù)表示類別。因此,在類別中不存在的任何值將被視為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大于bb大于c。

描述

使用分類數(shù)據(jù)上的.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())

執(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

獲取類別的屬性

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)

執(zhí)行上面示例代碼,得到以下結(jié)果 -

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)

執(zhí)行上面示例代碼,得到以下結(jié)果 -

False

該函數(shù)返回結(jié)果為: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)

執(zhí)行上面示例代碼,得到以下結(jié)果 -

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)

執(zhí)行上面示例代碼,得到以下結(jié)果 -

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"))

執(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]

分類數(shù)據(jù)的比較

在三種情況下可以將分類數(shù)據(jù)與其他對象進行比較 -

  • 將等號(==!=)與類別數(shù)據(jù)相同長度的類似列表的對象(列表,系列,數(shù)組…)進行比較。
  • 當(dāng)ordered==True和類別是相同時,所有比較(==,!=,>,>=<,和<=)分類數(shù)據(jù)到另一個分類系列。
  • 將分類數(shù)據(jù)與標(biāo)量進行比較。

看看下面的例子 -

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