Pandas分類對(duì)象

2022-07-15 10:43 更新

通常情況下,數(shù)據(jù)集中會(huì)存在許多同一類別的信息,比如相同國(guó)家、相同行政編碼、相同性別等,當(dāng)這些相同類別的數(shù)據(jù)多次出現(xiàn)時(shí),就會(huì)給數(shù)據(jù)處理增添許多麻煩,導(dǎo)致數(shù)據(jù)集變得臃腫,不能直觀、清晰地展示數(shù)據(jù)。

針對(duì)上述問(wèn)題,Pandas 提供了分類對(duì)象(Categorical Object),該對(duì)象能夠?qū)崿F(xiàn)有序排列、自動(dòng)去重的功能,但是它不能執(zhí)行運(yùn)算。本節(jié),我們了解一下分類對(duì)象的使用。

對(duì)象創(chuàng)建

我們可以通過(guò)多種方式創(chuàng)建分類對(duì)象,下面介紹以下兩種方法:

1) 指定dtype創(chuàng)建

  1. import pandas as pd
  2. s = pd.Series(["a","b","c","a"], dtype="category")
  3. print(s)

輸出結(jié)果:

0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

通過(guò)上述示例,您可能會(huì)注意到,雖然傳遞給 Series 四個(gè)元素值,但是它的類別為 3,這是因?yàn)?a 的類別存在重復(fù)。

2) pd.Categorical

通過(guò) Category  的構(gòu)造函數(shù),您可以創(chuàng)建一個(gè)類別對(duì)象。構(gòu)造函數(shù),如下所示:

pandas.Categorical(values, categories, ordered)


  • values:以列表的形式傳參,表示要分類的值。
  • ordered:布爾值,默認(rèn)為 False,若為 Ture,表示對(duì)分類的數(shù)據(jù)進(jìn)行排序。
  • dtype:返回一個(gè) category 類型,表示分類對(duì)象。

示例如下:

  1. import pandas as pd
  2. #自動(dòng)按a、b、c分類
  3. cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
  4. print(cat)

輸出結(jié)果:

[a, b, c, a, b, c]
Categories (3, object): [a, b, c]

再看一組示例:

  1. import pandas as pd
  2. cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
  3. print(cat)

輸出結(jié)果:

[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]

上述示例中,第二個(gè)參數(shù)值表示類別,當(dāng)列表中不存在某一類別時(shí),會(huì)自動(dòng)將類別值設(shè)置為 NA。

通過(guò)指定ordered=True來(lái)實(shí)現(xiàn)有序分類。示例如下:

  1. import pandas as pd
  2. cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
  3. print(cat)
  4. #求最小值
  5. print(cat.min())

輸出結(jié)果:

[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
c

獲取統(tǒng)計(jì)信息

對(duì)已經(jīng)分類的數(shù)據(jù)使用 describe() 方法,您會(huì)得到和數(shù)據(jù)統(tǒng)計(jì)相關(guān)的摘要信息。

  1. import pandas as pd
  2. import numpy as np
  3. cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
  4. df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
  5. print(df.describe())
  6. print(df["cat"].describe())

輸出結(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.categories命令可以獲取對(duì)象的類別信息。示例如下:

import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print (s.categories)

輸出結(jié)果:

Index(['b', 'a', 'c'], dtype='object')

通過(guò) obj.order 可以獲取 order 指定的布爾值:

import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
#False表示未指定排序
print (cat.ordered)

輸出結(jié)果:

False

重命名類別

要想對(duì)類別實(shí)現(xiàn)重命名,可以通過(guò) Series.cat.categories 來(lái)實(shí)現(xiàn)的,示例如下:

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#對(duì)類名重命名
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print(s.cat.categories)

輸出結(jié)果:

Index(['Group a', 'Group b', 'Group c'], dtype='object')

追加新類別

使用 s.cat.add_categories() 方法,可以追加新類別。

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#追加新類別
s = s.cat.add_categories([5])
#查看現(xiàn)有類別
print(s.cat.categories)

輸出結(jié)果:

Index(['a', 'b', 'c', 5], dtype='object')

刪除類別

使用 remove_categories() 方法,可以刪除不需要的類別。示例如下:

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
#原序列
print(s)
#刪除后序列
print(s.cat.remove_categories("a"))

輸出結(jié)果

0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

0    NaN
1      b
2      c
3    NaN
dtype: category
Categories (2, object): [b, c]

分類對(duì)象比較

在下述兩種情況下,我們可以對(duì)分類對(duì)象進(jìn)行比較:

  • 當(dāng)兩個(gè)類別對(duì)象長(zhǎng)度相同時(shí),可以進(jìn)行比較運(yùn)算;
  • 當(dāng)兩個(gè)類別的 ordered 均等于 True,并且類別相同時(shí),可以進(jìn)行比較運(yùn)算,比如 ==,!=,>,>=,< 和 <=。

示例如下:

import pandas as pd
s1=['a','a','b','d','c']
#當(dāng)滿足兩個(gè)類別長(zhǎng)度相同時(shí)
ss0=pd.Categorical(s1,categories=['a','d','b','c'])
ss1 = pd.Categorical(s1)
print(ss0==ss1)

輸出結(jié)果:

array([ True,  True,  True,  True,  True])

示例如下:

import pandas as pd

s1=['a','a','b','d','c']
s2=['a','b','b','d','c']
#滿足上述第二個(gè)條件,類別相同,并且ordered均為True
ss0=pd.Categorical(s1,categories=['a','d','b','c'],ordered=True)
ss1 = pd.Categorical(s2,categories=['a','d','b','c'],ordered=True)
print(ss0<ss1)

輸出結(jié)果:

array([False,  True, False, False, False])


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)