1. 程式人生 > 其它 >pandas之分類操作

pandas之分類操作

通常情況下,資料集中會存在許多同一類別的資訊,比如相同國家、相同行政編碼、相同性別等,當這些相同類別的資料多次出現時,就會給資料處理增添許多麻煩,導致資料集變得臃腫,不能直觀、清晰地展示資料。

針對上述問題,Pandas 提供了分類物件(Categorical Object),該物件能夠實現有序排列、自動去重的功能,但是它不能執行運算。本節,我們瞭解一下分類物件的使用。

物件建立

我們可以通過多種方式建立分類物件,下面介紹以下兩種方法:

1) 指定dtype建立

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

輸出結果:

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

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

2) pd.Categorical

通過 Category 的建構函式,您可以建立一個類別物件。建構函式,如下所示:

pandas.Categorical(values, categories, ordered)

values:以列表的形式傳參,表示要分類的值。
ordered:布林值,預設為 False,若為 Ture,表示對分類的資料進行排序。
dtype:返回一個 category 型別,表示分類物件。

示例如下:

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

輸出結果:

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

輸出結果:

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

上述示例中,第二個引數值表示類別,當列表中不存在某一類別時,會自動將類別值設定為 NA。

通過指定ordered=True來實現有序分類。示例如下:

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

輸出結果:

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

獲取統計資訊

對已經分類的資料使用 describe() 方法,您會得到和資料統計相關的摘要資訊。

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

輸出結果:

       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命令可以獲取物件的類別資訊。示例如下:

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

輸出結果:

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

通過 obj.order 可以獲取 order 指定的布林值:

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

輸出結果:

False

重新命名類別

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

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

輸出結果:

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

追加新類別

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

  1. import pandas as pd
  2. s = pd.Series(["a","b","c","a"], dtype="category")
  3. #追加新類別
  4. s = s.cat.add_categories([5])
  5. #檢視現有類別
  6. print(s.cat.categories)

輸出結果:

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

刪除類別

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

  1. import pandas as pd
  2. s = pd.Series(["a","b","c","a"], dtype="category")
  3. #原序列
  4. print(s)
  5. #刪除後序列
  6. print(s.cat.remove_categories("a"))

輸出結果

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]

分類物件比較

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

  • 當兩個類別物件長度相同時,可以進行比較運算;
  • 當兩個類別的ordered 均等於True,並且類別相同時,可以進行比較運算,比如 ==,!=,>,>=,< 和 <=。


示例如下:

  1. import pandas as pd
  2. s1=['a','a','b','d','c']
  3. #當滿足兩個類別長度相同時
  4. ss0=pd.Categorical(s1,categories=['a','d','b','c'])
  5. ss1 = pd.Categorical(s1)
  6. print(ss0==ss1)

輸出結果:

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

示例如下:
import pandas as pd

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

輸出結果:

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