Pandas分類對象

2022-07-15 10:43 更新

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

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

對象創(chuàng)建

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

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]

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

2) pd.Categorical

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

pandas.Categorical(values, categories, ordered)


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

示例如下:

  1. import pandas as pd
  2. #自動按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]

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

通過指定ordered=True來實現(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īng)分類的數(shù)據(jù)使用 describe() 方法,您會得到和數(shù)據(jù)統(tǒng)計相關(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命令可以獲取對象的類別信息。示例如下:

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

通過 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

重命名類別

要想對類別實現(xiàn)重命名,可以通過 Series.cat.categories 來實現(xiàn)的,示例如下:

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)

輸出結(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]

分類對象比較

在下述兩種情況下,我們可以對分類對象進行比較:

  • 當(dāng)兩個類別對象長度相同時,可以進行比較運算;
  • 當(dāng)兩個類別的 ordered 均等于 True,并且類別相同時,可以進行比較運算,比如 ==,!=,>,>=,< 和 <=。

示例如下:

import pandas as pd
s1=['a','a','b','d','c']
#當(dāng)滿足兩個類別長度相同時
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']
#滿足上述第二個條件,類別相同,并且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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號