pandas 的 Category 應(yīng)用

關(guān)于 pandas 的 Categorical 類型的數(shù)據(jù),官方文檔是這樣描述的:

Categoricals 是 pandas 的一種數(shù)據(jù)類型,對應(yīng)著被統(tǒng)計的變量。Categoricals 是由固定的且有限數(shù)量的變量組成的。比如:性別、社會階層、血型、國籍、觀察時段、贊美程度等等。

與其它被統(tǒng)計的變量相比,categorical 類型的數(shù)據(jù)可以具有特定的順序——比如:按程度來設(shè)定,“強(qiáng)烈同意”與“同意”,“首次觀察”與“二次觀察”,但是不能做按數(shù)值來進(jìn)行排序操作(比如:sort_by 之類的,換句話說,categorical 的順序是創(chuàng)建時手工設(shè)定的,是靜態(tài)的)

類型數(shù)據(jù)的每一個元素的值要么是預(yù)設(shè)好的類型中的某一個,要么是空值(np.nan)。順序是由預(yù)設(shè)好的類型集合來決定的,而不是按照類型集合中各個元素的字母順序排序的。categorical 實例的內(nèi)部是由類型名字集合和一個整數(shù)組成的數(shù)組構(gòu)成的,后者標(biāo)明了類型集合真正的值。

對 Categorical 數(shù)據(jù)的一個直觀認(rèn)識

隱式創(chuàng)建 Categorical 數(shù)據(jù)

用一段代碼從不同角度來展現(xiàn)一下 categorical 類型的數(shù)據(jù)。

# 先創(chuàng)建一個簡單的 DataFrame 實例
# Terry, Hardon, Curry, Duran, James 和 Barter 代表東西部玩三打三
# 用一組數(shù)據(jù)記錄各自的得分情況
import pandas as pd, numpy as np
players=['Garsol','Hardon','Bill','Duran','James','Barter']
scores=[22,34,12,31,26,19]
teams=['West','West','East','West','East','East']
df=pd.DataFrame({'player':players,'score':scores,'team':teams})
df

輸出:

   player  score  team
0  Garsol     22  West
1  Hardon     34  West
2    Bill     12  East
3   Duran     31  West
4   James     26  East
5  Barter     19  East

可以看出 team 這一列,其實只有兩種值:East 和 West,可以將 team 列的類型設(shè)定為 category

df.team.astype('category')
0    West
1    West
2    East
3    West
4    East
5    East
Name: team, dtype: category
Categories (2, object): [East, West]

可以看到,df.team 的變量類型變成了 category。當(dāng)然,迄今為止,這個分類是我們手工標(biāo)記上去的,主動給每一個球員加上了 east 或者 west 的標(biāo)記。那么,如果是動態(tài)的來添加呢?比如按照得分來劃分,將高于平均分的劃為 Star,低于平均分的劃為 Role。計算過程就應(yīng)該是這樣:

d=pd.Series(scores).describe()
score_ranges=[d['min']-1,d['mean'],d['max']+1]
score_labels=['Role','Star']
# 用pd.cut(ori_data, bins, labels) 方法
# 以 bins 設(shè)定的畫界點(diǎn)來將 ori_data 歸類,然后用 labels 中對應(yīng)的 label 來作為分類名
df['level']=pd.cut(df['score'],score_ranges,labels=score_labels)
print 'df :'
print df
print '\n對比一下 Category 類型的數(shù)據(jù)和普通的 DataFrame中的列有什么區(qū)別'
print '\ndf[\'team\'] 是普通的 DataFrame列'
print df['team']
print '\ndf[\'level\'] 是 Category 類型的'
print df['level']
print '\n可以看出 df[\'level\'] 有點(diǎn)像是集合,輸出信息會去重后列出組成元素'
print df['level'].get_values()
df :
   player  score  team level
0  Garsol     22  West  Role
1  Hardon     34  West  Star
2    Bill     12  East  Role
3   Duran     31  West  Star
4   James     26  East  Star
5  Barter     19  East  Role

對比一下 Category 類型的數(shù)據(jù)和普通的 DataFrame中的列有什么區(qū)別

df['team'] 是普通的 DataFrame列
0    West
1    West
2    East
3    West
4    East
5    East
Name: team, dtype: object

df['level'] 是 Category 類型的
0    Role
1    Star
2    Role
3    Star
4    Star
5    Role
Name: level, dtype: category
Categories (2, object): [Role < Star]

可以看出 df['level'] 有點(diǎn)像是集合,輸出信息會去重后列出組成元素
['Role' 'Star' 'Role' 'Star' 'Star' 'Role']

顯式創(chuàng)建 Categorical 數(shù)據(jù)

cg=pd.Categorical(['Role','Role','Star','Role','Killer','Star'],categories=['Role', 'Star'])
cg
[Role, Role, Star, Role, NaN, Star]
Categories (2, object): [Role, Star]

可以看到,構(gòu)造方法中第二個參數(shù)是指定了實例中可以包含的元素,在第一個參數(shù)中的元素如果不在 categories 中,就會被轉(zhuǎn)成NaN。
Categorical 實例可以轉(zhuǎn)為 Series,被稱為 categorical series

s=pd.Series(cg)
s
0    Role
1    Role
2    Star
3    Role
4     NaN
5    Star
dtype: category
Categories (2, object): [Role, Star]

也可以將 categorical 實例加入到 dataframe 實例的某一列中,被稱為 categorical dataframe column:

df=pd.DataFrame({'players':['Garsol','Hardon','Bill','Duran','James','Barter']})
df['level']=cg
print df['level'],'\n\n',df.dtypes
0    Role
1    Role
2    Star
3    Role
4     NaN
5    Star
Name: level, dtype: category
Categories (2, object): [Role, Star] 
players      object
level      category
dtype: object
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在寫個性化推薦的論文,經(jīng)常用到Python來處理數(shù)據(jù),被pandas和numpy中的數(shù)據(jù)選取和索引問題繞的比較...
    shuhanrainbow閱讀 4,703評論 6 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,413評論 6 13
  • 參考:https://amaozhao.gitbooks.io/pandas-notebook/content/h...
    與爾巖說閱讀 8,882評論 0 26

友情鏈接更多精彩內(nèi)容