Pandas計(jì)算元素的數(shù)量和頻率的方法(出現(xiàn)的次數(shù))
在pandas.Series的pandas.DataFrame列中,將描述獲取唯一元素?cái)?shù)(不包括重復(fù)項(xiàng)的案例數(shù))和每個(gè)元素的出現(xiàn)頻率(出現(xiàn)數(shù))的方法。
使用pandas.Series方法的unique(),value_counts()和nunique()。還提供了nunique()作為pandas.DataFrame的方法。
在這里:
- pandas.Series.unique():返回NumPy數(shù)組ndarray中唯一元素值的列表
- pandas.Series.value_counts():返回唯一元素的值及其在出現(xiàn)的次數(shù)。
- pandas.Series.nunique(), pandas.DataFrame.nunique():返回int,pandas.Series中唯一元素的數(shù)量。
在解釋了基本用法之后,對(duì)一下內(nèi)容進(jìn)行介紹。
- 唯一元素的數(shù)量(不包括重復(fù)項(xiàng)的)
- 唯一元素值列表
- 唯一元素的頻率(出現(xiàn)次數(shù))
- 獨(dú)特元素及其出現(xiàn)的字典
- 模式及其頻率
- 歸一化頻率
以下面的數(shù)據(jù)為例。
import pandas as pd import numpy as np df = pd.read_csv('./data/15/sample_pandas_normal.csv') df.iloc[1] = np.nan print(df) # ? ? ? name ? age state ?point # 0 ? ?Alice ?24.0 ? ?NY ? 64.0 # 1 ? ? ?NaN ? NaN ? NaN ? ?NaN # 2 ?Charlie ?18.0 ? ?CA ? 70.0 # 3 ? ? Dave ?68.0 ? ?TX ? 70.0 # 4 ? ?Ellen ?24.0 ? ?CA ? 88.0 # 5 ? ?Frank ?30.0 ? ?NY ? 57.0
pandas.Series.unique():返回NumPy數(shù)組ndarray中唯一元素值的列表
unique()返回唯一元素值的列表。一維NumPy數(shù)組ndarray類(lèi)型而不是列表類(lèi)型(Python內(nèi)置類(lèi)型)。還包括缺失值NaN。
u = df['state'].unique() print(u) print(type(u)) # ['NY' nan 'CA' 'TX'] # <class 'numpy.ndarray'>
pandas.Series.value_counts():返回唯一元素的值及其在出現(xiàn)的次數(shù)。
value_counts()返回pandas.Series,其中唯一元素的值是index,出現(xiàn)的次數(shù)是data。當(dāng)需要元素的頻率(出現(xiàn)次數(shù))時(shí)使用此選項(xiàng)。
vc = df['state'].value_counts() print(vc) print(type(vc)) # NY 2 # CA 2 # TX 1 # Name: state, dtype: int64 # <class 'pandas.core.series.Series'>
默認(rèn)情況下,它按出現(xiàn)次數(shù)的降序排序,但是如果參數(shù)ascending = True,則以升序排序,如果參數(shù)sort = False,則不進(jìn)行排序。
print(df['state'].value_counts(ascending=True)) # TX ? ?1 # CA ? ?2 # NY ? ?2 # Name: state, dtype: int64 print(df['state'].value_counts(sort=False)) # CA ? ?2 # NY ? ?2 # TX ? ?1 # Name: state, dtype: int64
默認(rèn)情況下,NaN被排除,但如果參數(shù)dropna = False,則也計(jì)入NaN。
print(df['state'].value_counts(dropna=False)) # NY 2 # CA 2 # TX 1 # NaN 1 # Name: state, dtype: int64
如果指定了參數(shù)normalize = True,則將值歸一化,以使總數(shù)變?yōu)?。
請(qǐng)注意,如果包含缺失值NaN,則該值將根據(jù)參數(shù)dropna的設(shè)置而有所不同。
print(df['state'].value_counts(dropna=False, normalize=True)) # NY 0.333333 # CA 0.333333 # TX 0.166667 # NaN 0.166667 # Name: state, dtype: float64
pandas.Series.nunique(), pandas.DataFrame.nunique():返回int,pandas.Series中唯一元素的數(shù)量。
pandas.Series.nunique()以整數(shù)int形式返回唯一元素的數(shù)量。
默認(rèn)情況下,不包含NaN,并且如果指定了參數(shù)dropna = False,則結(jié)果還將包含NaN。
nu = df['state'].nunique() print(nu) print(type(nu)) # 3 # <class 'int'> print(df['state'].nunique(dropna=False)) # 4
pandas.DataFrame.nunique()計(jì)算每列的唯一元素?cái)?shù)。返回pandas.Series類(lèi)型。
默認(rèn)情況下,不包含NaN,并且如果指定了參數(shù)dropna = False,則結(jié)果還將包含NaN。
默認(rèn)情況下,該值為每列,但是如果參數(shù)axis = 1或axis =‘columns’,則返回每行的值。
nu_col = df.nunique() print(nu_col) print(type(nu_col)) # name ? ? 5 # age ? ? ?4 # state ? ?3 # point ? ?4 # dtype: int64 # <class 'pandas.core.series.Series'> print(df.nunique(dropna=False)) # name ? ? 6 # age ? ? ?5 # state ? ?4 # point ? ?5 # dtype: int64 print(df.nunique(dropna=False, axis='columns')) # 0 ? ?4 # 1 ? ?1 # 2 ? ?4 # 3 ? ?4 # 4 ? ?4 # 5 ? ?4 # dtype: int64
唯一元素的數(shù)量(不包括重復(fù)項(xiàng)的)
如上所述,pandas.Series.nunique()和pandas.DataFrame.nunique()可以計(jì)算唯一元素的數(shù)量(唯一元素的數(shù)量)。
print(df['state'].nunique()) # 3 print(df.nunique()) # name ? ? 5 # age ? ? ?4 # state ? ?3 # point ? ?4 # dtype: int64
唯一元素值列表
使用unique(),您可以獲取NumPy數(shù)組ndarray類(lèi)型的唯一元素值的列表。如果要使用列表類(lèi)型(Python內(nèi)置類(lèi)型),則可以使用tolist()方法將其轉(zhuǎn)換。
print(df['state'].unique().tolist()) print(type(df['state'].unique().tolist())) # ['NY', nan, 'CA', 'TX'] # <class 'list'>
可以將tolist()方法應(yīng)用于通過(guò)value_counts()獲得的pandas.Series的索引。也可以作為NumPy數(shù)組ndarray類(lèi)型的值來(lái)獲取。
print(df['state'].value_counts().index.tolist()) print(type(df['state'].value_counts().index.tolist())) # ['NY', 'CA', 'TX'] # <class 'list'> print(df['state'].value_counts(dropna=False).index.values) print(type(df['state'].value_counts().index.values)) # ['NY' 'CA' 'TX' nan] # <class 'numpy.ndarray'>
如上所述,在unique()的情況下,始終包含NaN,但是value_counts()可以指定參數(shù)dropna是否包含NaN。
唯一元素的頻率(出現(xiàn)次數(shù))
要獲取每個(gè)唯一元素的頻率(出現(xiàn)次數(shù)),請(qǐng)?jiān)L問(wèn)通過(guò)value_counts()獲得的pandas.Series的值。
print(df['state'].value_counts()['NY']) # 2 print(df['state'].value_counts().NY) # 2
使用iteritems()方法檢索for循環(huán)中的元素值和頻率(出現(xiàn)次數(shù))。
for index, value in df['state'].value_counts().iteritems(): print(index, ': ', value) # NY : 2 # CA : 2 # TX : 1
獨(dú)特元素及其出現(xiàn)的字典
也可以將to_dict()方法應(yīng)用于value_counts()獲得的pandas.Series使其成為字典。
d = df['state'].value_counts().to_dict() print(d) print(type(d)) # {'NY': 2, 'CA': 2, 'TX': 1} # <class 'dict'> print(d['NY']) # 2
使用items()方法在for循環(huán)中檢索元素值和頻率(出現(xiàn)次數(shù))。
for key, value in d.items(): print(key, ': ', value) # NY : 2 # CA : 2 # TX : 1
模式及其頻率
默認(rèn)情況下,value_counts()返回pandas.Series,它以出現(xiàn)次數(shù)的降序排列,因此頂部是最頻繁出現(xiàn)的值及其頻率。
print(df['state'].value_counts()) # NY ? ?2 # CA ? ?2 # TX ? ?1 # Name: state, dtype: int64 print(df['state'].value_counts().index[0]) # NY print(df['state'].value_counts().iat[0]) # 2
原始pandas.Series的元素成為所得pandas.Series的索引。當(dāng)數(shù)值為索引時(shí),無(wú)法使用[Number]指定該值(這會(huì)導(dǎo)致錯(cuò)誤),因此嚴(yán)格使用iat [Number]進(jìn)行指定。 (由于示例是字符串,因此[Number]無(wú)關(guān)緊要)
使用apply()方法將其應(yīng)用于pandas.DataFrame的每一列。
Pandas中map(),applymap(),apply()函數(shù)的使用方法
print(df.apply(lambda x: x.value_counts().index[0])) # name ? ? Frank # age ? ? ? ? 24 # state ? ? ? NY # point ? ? ? 70 # dtype: object print(df.apply(lambda x: x.value_counts().iat[0])) # name ? ? 1 # age ? ? ?2 # state ? ?2 # point ? ?2 # dtype: int64
如果存在多種模式,則上述方法只能獲得一種模式。
mode()
pandas.Series的mode()方法將模式值返回為pandas.Series。如果使用tolist()列出此結(jié)果,則可以將模式值作為列表獲取。請(qǐng)注意,即使只有一種模式,也將是一個(gè)列表。
print(df['state'].mode()) # 0 ? ?CA # 1 ? ?NY # dtype: object print(df['state'].mode().tolist()) # ['CA', 'NY'] print(df['age'].mode().tolist()) # [24.0]
使用apply()方法將mode()應(yīng)用于每列將產(chǎn)生具有列表類(lèi)型元素的pandas.Series()。
s_mode = df.apply(lambda x: x.mode().tolist()) print(s_mode) # name ? ? [Alice, Charlie, Dave, Ellen, Frank] # age ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[24.0] # state ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[CA, NY] # point ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[70.0] # dtype: object print(type(s_mode)) # <class 'pandas.core.series.Series'> print(s_mode['name']) # ['Alice', 'Charlie', 'Dave', 'Ellen', 'Frank'] print(type(s_mode['name'])) # <class 'list'>
mode()也作為pandas.DataFrame的方法提供。返回pandas.DataFrame。由于各列的模式數(shù)不同,所以空缺部分成為缺失值NaN。
print(df.mode()) # name age state point # 0 Alice 24.0 CA 70.0 # 1 Charlie NaN NY NaN # 2 Dave NaN NaN NaN # 3 Ellen NaN NaN NaN # 4 Frank NaN NaN NaN
可以使用count()方法獲得每列中的模式數(shù),該方法對(duì)不缺少值NaN的元素?cái)?shù)進(jìn)行計(jì)數(shù)。
print(df.mode().count()) # name 5 # age 1 # state 2 # point 1 # dtype: int64
describe()
同樣,正如我在開(kāi)始時(shí)所寫(xiě)的那樣,describe()方法可用于共同計(jì)算每一列的唯一元素的數(shù)量,模式值及其頻率(出現(xiàn)的次數(shù))。每個(gè)項(xiàng)目都可以使用loc []獲得。
print(df.astype('str').describe()) # ? ? ? ? ?name ? age state point # count ? ? ? 6 ? ? 6 ? ? 6 ? ? 6 # unique ? ? ?6 ? ? 5 ? ? 4 ? ? 5 # top ? ? Frank ?24.0 ? ?CA ?70.0 # freq ? ? ? ?1 ? ? 2 ? ? 2 ? ? 2 print(df.astype('str').describe().loc['top']) # name ? ? Frank # age ? ? ? 24.0 # state ? ? ? CA # point ? ? 70.0 # Name: top, dtype: object
在describe()中,由列類(lèi)型dtype計(jì)算出的項(xiàng)是不同的,因此使用astype()進(jìn)行類(lèi)型轉(zhuǎn)換(轉(zhuǎn)換)。
歸一化頻率
如上所述,當(dāng)將value_counts()的參數(shù)歸一化設(shè)置為T(mén)rue時(shí),將歸一化以使總數(shù)變?yōu)?的值被返回。
請(qǐng)注意,如果包含缺失值NaN,則該值將根據(jù)參數(shù)dropna的設(shè)置而有所不同。
比較多個(gè)數(shù)據(jù)的頻率分布時(shí),很方便。
print(df['state'].value_counts(dropna=False, normalize=True)) # NY 0.333333 # CA 0.333333 # TX 0.166667 # NaN 0.166667 # Name: state, dtype: float64
到此這篇關(guān)于Pandas計(jì)算元素的數(shù)量和頻率(出現(xiàn)的次數(shù))的文章就介紹到這了,更多相關(guān)Pandas計(jì)算元素?cái)?shù)量和頻率內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)單的文件傳輸與MySQL備份的腳本分享
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單的文件傳輸與MySQL備份的腳本分享,用到了socket與tarfile模塊,需要的朋友可以參考下2016-01-01Pycharm中安裝pywin32報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了Pycharm中安裝pywin32報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04使用Python實(shí)現(xiàn)廣告點(diǎn)擊率預(yù)測(cè)
廣告點(diǎn)擊率是指有多少用戶(hù)點(diǎn)擊了您的廣告與有多少用戶(hù)查看了您的廣告的比率,本文主要為大家介紹了如何使用Python實(shí)現(xiàn)廣告點(diǎn)擊率預(yù)測(cè),感興趣的小伙伴可以了解下2023-10-10使用Python創(chuàng)建快捷方式管理應(yīng)用
在Windows系統(tǒng)中,快速訪(fǎng)問(wèn)常用程序通常通過(guò)“開(kāi)始菜單”中的“應(yīng)用熱門(mén)”功能實(shí)現(xiàn),在這篇博客中,我將向你展示如何使用Python和wxPython創(chuàng)建一個(gè)GUI應(yīng)用,幫助用戶(hù)輕松將桌面上的快捷方式添加到Windows“開(kāi)始菜單”的“應(yīng)用熱門(mén)”中,需要的朋友可以參考下2024-08-08解決python刪除文件的權(quán)限錯(cuò)誤問(wèn)題
下面小編就為大家分享一篇解決python刪除文件的權(quán)限錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04