2020-08-06--Pandas-05--分類數(shù)據(jù)處理

來看看 Pandas 中分類(category)數(shù)據(jù)如何處理吧呈驶。

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

1.使用dtype="category"創(chuàng)建

在創(chuàng)建分類數(shù)據(jù)之前任岸,先來了解下什么是分類(Category)數(shù)據(jù)呢乘客?分類數(shù)據(jù)直白來說就是取值為有限的含潘,或者說是固定數(shù)量的可能值。例如:性別飒箭、血型狼电。

這里以血型為例,假定每個(gè)用戶有以下的血型弦蹂,我們?nèi)绾蝿?chuàng)建一個(gè)關(guān)于血型的分類對(duì)象呢肩碟?

一種有效的方法就是明確指定 dtype="category"

import pandas as pd
import numpy as np

index = pd.Index(data=['Tom','Bob','Mary','James','Andy','Alice'])

user_info = pd.Series(data=['A','AB',np.nan,'AB','O','B'],index=index,name='blood_type',dtype='category')

print(user_info)
# Tom        A
# Bob       AB
# Mary     NaN
# James     AB
# Andy       O
# Alice      B
# Name: blood_type, dtype: category
# Categories (4, object): ['A', 'AB', 'B', 'O']

2.使用pd.Categorical 創(chuàng)建

# categories:指定存儲(chǔ)的分類信息
c = pd.Categorical(["A", "AB", np.nan, "AB", "O", "B"], categories=["A", "B", "AB"])
print(c)
# ['A', 'AB', NaN, 'AB', NaN, 'B']
# Categories (3, object): ['A', 'B', 'AB']

3.astype

除了上面這些方法外,經(jīng)常遇到的情況是已經(jīng)創(chuàng)建了一個(gè) Series凸椿,如何將它轉(zhuǎn)為分類數(shù)據(jù)呢削祈?來看看 astype 用法吧。

user_info = pd.Series(data=["A", "AB", np.nan, "AB", "O", "B"], index=index, name="blood_type")
user_info = user_info.astype("category")
print(user_info)
# Tom        A
# Bob       AB
# Mary     NaN
# James     AB
# Andy       O
# Alice      B
# Name: blood_type, dtype: category
# Categories (4, object): ['A', 'AB', 'B', 'O']

此外脑漫,一些其他的方法返回的結(jié)果也是分類數(shù)據(jù)髓抑。如 cut 、 qcut窿撬。具體可以見 Pandas基本功能詳解中的離散化部分。

常用操作

統(tǒng)計(jì)

可以對(duì)分類數(shù)據(jù)使用 .describe() 方法叙凡。

c = user_info.describe()
print(c)
# count      5
# unique     4
# top       AB
# freq       2
# Name: blood_type, dtype: object

解釋下每個(gè)指標(biāo)的含義劈伴,count 表示非空的數(shù)據(jù)有5條,unique 表示去重后的非空數(shù)據(jù)有4條握爷,top 表示出現(xiàn)次數(shù)最多的值為 AB跛璧,freq 表示出現(xiàn)次數(shù)最多的值的次數(shù)為2次。

分類數(shù)據(jù)的取值

我們可以使用 .cat.categories 來獲取分類數(shù)據(jù)所有可能的取值新啼。

c = user_info.cat.categories
print(c)
# Index(['A', 'AB', 'B', 'O'], dtype='object')

修改分類名稱

user_info = user_info.cat.rename_categories(["A+", "AB+", "B+", "O+"])
print(user_info)
# Tom       A+
# Bob      AB+
# Mary     NaN
# James    AB+
# Andy      O+
# Alice     B+
# Name: blood_type, dtype: category
# Categories (4, object): ['A+', 'AB+', 'B+', 'O+']

修改分類名稱后追城,也會(huì)將數(shù)據(jù)中的對(duì)應(yīng)進(jìn)行修改。

類似的燥撞,除了重命名座柱,也會(huì)遇到添加類別迷帜,刪除分類的操作,這些都可以通過 .cat.add_categories 色洞,.cat.remove_categories 來實(shí)現(xiàn)戏锹。

user_info = user_info.cat.add_categories(["C"])
print(user_info)
# Tom       A+
# Bob      AB+
# Mary     NaN
# James    AB+
# Andy      O+
# Alice     B+
# Name: blood_type, dtype: category
# Categories (5, object): ['A+', 'AB+', 'B+', 'O+', 'C']

查看數(shù)據(jù)分布統(tǒng)計(jì)

分類數(shù)據(jù)也是支持使用 value_counts 方法來查看數(shù)據(jù)分布的。

c = user_info.value_counts()
print(c)
# AB+    2
# O+     1
# B+     1
# A+     1
# C      0
# Name: blood_type, dtype: int64

.str

分類數(shù)據(jù)也是支持使用 .str 屬性來訪問的火诸。例如想要查看下是否包含字母 "A"锦针,可以使用 .srt.contains 方法。

c = user_info.str.contains('A')
print(c)
# Tom       True
# Bob       True
# Mary       NaN
# James     True
# Andy     False
# Alice    False
# Name: blood_type, dtype: object

返回一個(gè)bool值的Series序列置蜀,利用花式索引可以獲取到符合條件的數(shù)據(jù)奈搜。

更多關(guān)于 .str 的詳細(xì)介紹可以見 Pandas文本數(shù)據(jù)處理。

合并數(shù)據(jù)

pd.concat([Series,Series])

blood_type1 = pd.Categorical(["A", "AB"])
blood_type2 = pd.Categorical(["B", "O"])

c = pd.concat([pd.Series(blood_type1), pd.Series(blood_type2)])

print(c)
# 0     A
# 1    AB
# 0     B
# 1     O
# dtype: object

可以發(fā)現(xiàn)盯荤,分類數(shù)據(jù)經(jīng)過 pd.concat 合并后類型轉(zhuǎn)為了 object 類型馋吗。如果想要保持分類類型的話,可以借助 union_categoricals 來完成廷雅。

from pandas.api.types import union_categoricals

c = union_categoricals([blood_type1, blood_type2])
print(c)
# 0     A
# 1    AB
# 0     B
# 1     O
# dtype: object
# ['A', 'AB', 'B', 'O']
# Categories (4, object): ['A', 'AB', 'B', 'O']

分類數(shù)據(jù)與Series序列的內(nèi)存對(duì)比

blood_type = pd.Series(["AB","O"]*1000)
blood_type.nbytes
16000
blood_type.astype("category").nbytes
2016

對(duì)比下耗美,是不是發(fā)現(xiàn)分類數(shù)據(jù)非常節(jié)省內(nèi)存。但是當(dāng)類別的數(shù)量接近數(shù)據(jù)的長(zhǎng)度航缀,那么 Categorical 將使用與等效的 object 表示幾乎相同或更多的內(nèi)存商架。

blood_type = pd.Series(['AB%04d' % i for i in range(2000)])
blood_type.nbytes
16000
blood_type.astype("category").nbytes
20000
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芥玉,隨后出現(xiàn)的幾起案子蛇摸,更是在濱河造成了極大的恐慌,老刑警劉巖灿巧,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶袄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抠藕,警方通過查閱死者的電腦和手機(jī)饿肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾似,“玉大人敬辣,你說我怎么就攤上這事×阍海” “怎么了溉跃?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)告抄。 經(jīng)常有香客問我撰茎,道長(zhǎng),這世上最難降的妖魔是什么打洼? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任龄糊,我火速辦了婚禮逆粹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绎签。我一直安慰自己枯饿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布诡必。 她就那樣靜靜地躺著奢方,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爸舒。 梳的紋絲不亂的頭發(fā)上蟋字,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音扭勉,去河邊找鬼鹊奖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涂炎,可吹牛的內(nèi)容都是我干的忠聚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼唱捣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼两蟀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起震缭,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤赂毯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拣宰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體党涕,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年巡社,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膛堤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晌该,死狀恐怖肥荔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气笙,我是刑警寧澤次企,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布怯晕,位于F島的核電站潜圃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舟茶。R本人自食惡果不足惜谭期,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一堵第、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隧出,春花似錦踏志、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凄诞,卻和暖如春圆雁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帆谍。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工伪朽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汛蝙。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓烈涮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窖剑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坚洽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360