??說起pandas這個(gè)是python數(shù)據(jù)清洗的利器键耕,它可以讓你像sql一樣操作數(shù)據(jù)咧叭,同時(shí)可以對數(shù)據(jù)進(jìn)行各種計(jì)算葱跋,轉(zhuǎn)換完成后還可以方便的存儲(chǔ)到excel澳化,轉(zhuǎn)化為array崔步、Matrix供進(jìn)一步(模型)使用。但是網(wǎng)上關(guān)于pandas的知識(shí)點(diǎn)比較散缎谷,本文就按照筆者的理解井濒,分門別類的來介紹pandas的常用函數(shù)。本文可能稍微有點(diǎn)長慎陵,但是能夠滿足你對于pandas學(xué)習(xí)的所有需要眼虱,本文介紹的函數(shù)在實(shí)際中也很常用。本文較長席纽,也可以當(dāng)做參考使用捏悬。
以下數(shù)據(jù)的操作,基于這幾個(gè)基礎(chǔ)數(shù)據(jù)润梯。
data_a
1 2 3 4
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
data_b
A B C D
0 1.0 1.0 2 2.0
1 2.0 3.0 2 2.0
2 2.0 3.0 1 4.0
3 2.0 3.0 2 2.0
data_c
0 1 2
0 1.0 2.0 3.0
1 NaN NaN 2.0
2 NaN NaN NaN
3 8.0 8.0 NaN
??發(fā)現(xiàn)大家大于axis=0和axis=1參數(shù)到底怎么用不了解过牙,經(jīng)常混淆纺铭,到底是對列還是對行操作寇钉。其實(shí)這么理解比較好,axis=0是默認(rèn)的舶赔,按行進(jìn)行操作扫倡,其實(shí)就是對列進(jìn)行一系列操作;axis=1需要自己設(shè)置,按列進(jìn)行操作竟纳,其實(shí)就是對行進(jìn)行一系列操作撵溃。
1.數(shù)據(jù)操作函數(shù)
??數(shù)據(jù)操作函數(shù)包括數(shù)據(jù)的讀取、檢查锥累、規(guī)整等操作缘挑,是數(shù)據(jù)清洗的開始階段。
- read系列函數(shù)
??這個(gè)知識(shí)點(diǎn)比較多桶略,因?yàn)閜andas可讀的數(shù)據(jù)類型非常多语淘,所以我單獨(dú)寫一篇介紹這個(gè)知識(shí)點(diǎn)诲宇,但是最常用的還是read_csv,這個(gè)函數(shù)尤其要注意編碼問題惶翻。 - columns姑蓝、index
??嚴(yán)格說這兩個(gè)不叫函數(shù)而是叫屬性,但為了介紹方便维贺,姑且放到函數(shù)里它掂,分別返回列名和行名,這個(gè)沒啥好說的溯泣,注意使用的時(shí)候不要打括號(hào)。 - head和tail函數(shù)
??這兩個(gè)函數(shù)分別取你的dataframe的前幾行和后幾行數(shù)據(jù)榕茧,只有一個(gè)參數(shù)n垃沦,就是你想看幾行就head或tail幾行。 - rename函數(shù)
??這個(gè)函數(shù)是對列名進(jìn)行更改用押,通常在讀數(shù)據(jù)的時(shí)候可以設(shè)置header=True讀取第一行作為列名肢簿,或者人為給定columns參數(shù),但是很多時(shí)候我們需要對列名進(jìn)行更改蜻拨,此時(shí)用rename函數(shù)池充,基本用法為rename
(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)。rename函數(shù)也可以通過指定axis參數(shù)或者index,column參數(shù)設(shè)置修改行名或者列名缎讼,這里還有一個(gè)參數(shù)比較有用就是inplace收夸,默認(rèn)為false即返回新的dataframe,如果為true則在原dataframe上進(jìn)行操作血崭。最常用的就是利用字典改名卧惜,用鍵值對的形式將原列名和現(xiàn)列名對應(yīng)起來。當(dāng)然還有一種笨辦法直接通過df.columns = list[]夹纫,這個(gè)list要求和df的colunms長度完全相同咽瓷,否則報(bào)錯(cuò)。
data_b.rename(index=str, columns={"A": "a", "B": "c"})
-- 輸出
Out[127]:
a c C D
0 1.0 1.0 2 2.0
1 2.0 3.0 2 2.0
2 2.0 3.0 1 4.0
3 2.0 3.0 2 2.0
- reindex函數(shù)
??reindex函數(shù)是為series或dataframe增加或減少索引舰讹、列名用的茅姜,注意不可以用它為index改名(改名還是要用rename,設(shè)置axis=1)月匣,增加索引钻洒,沒有默認(rèn)值定義為為Nan,減少索引相當(dāng)于對index進(jìn)行切片了桶错。reindex官方文檔給了很多參數(shù)航唆,但只有幾個(gè)很重要,column院刁、index糯钙,即控制對行、列的操作,fill_value控制默認(rèn)缺省值任岸。
data_b.reindex(columns=['A','B','C','D','E'],fill_value=3.0)
-- 輸出
A B C D E
0 1.0 1.0 2 2.0 3.0
1 2.0 3.0 2 2.0 3.0
2 2.0 3.0 1 4.0 3.0
3 2.0 3.0 2 2.0 3.0
data_b.reindex(index=['0','1','2','3'],fill_value=3.0)
--輸出
A B C D
0 3.0 3.0 3.0 3.0
1 3.0 3.0 3.0 3.0
2 3.0 3.0 3.0 3.0
3 3.0 3.0 3.0 3.0
- set_index函數(shù)和reset_index函數(shù)
??set_index可以設(shè)置單索引或者多索引再榄,基本用法為set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) 大部分情況下我們只需要關(guān)注keys這個(gè)指標(biāo),其他指標(biāo)可以不關(guān)注享潜。reset_index()就是取消索引困鸥,重新變?yōu)檎麛?shù)索引那種形式。
data_b.set_index(['A','B'])
--輸出
C D
A B
1.0 1.0 2 2.0
2.0 3.0 2 2.0
3.0 1 4.0
3.0 2 2.0
data_b.reset_index()
--輸出
index A B C D
0 0 1.0 1.0 2 2.0
1 1 2.0 3.0 2 2.0
2 2 2.0 3.0 1 4.0
3 3 2.0 3.0 2 2.0
- describe函數(shù)
??這個(gè)函數(shù)真是良心剑按,沒有任何參數(shù)疾就,直接對著你的數(shù)據(jù)框用就可以了,輸出的是對于你數(shù)據(jù)框整體數(shù)據(jù)的描述艺蝴。
data_a.describe()
--輸出
1 2 3 4
count 3.0 3.0 3.0 3.0
mean 4.0 5.0 6.0 7.0
std 4.0 4.0 4.0 4.0
min 0.0 1.0 2.0 3.0
25% 2.0 3.0 4.0 5.0
50% 4.0 5.0 6.0 7.0
75% 6.0 7.0 8.0 9.0
max 8.0 9.0 10.0 11.0
- info函數(shù)
??這個(gè)函數(shù)用來查看數(shù)據(jù)的類型猬腰,有沒有缺失值,在進(jìn)行特征工程的時(shí)候比較好用猜敢。
data_a.info()
--輸出
Data columns (total 4 columns):
1 3 non-null int64
2 3 non-null int64
3 3 non-null int64
4 3 non-null int64
dtypes: int64(4)
memory usage: 176.0 bytes
- shape函數(shù)
- values函數(shù)
- df.duplicated函數(shù)
- df.drop_duplicates函數(shù)
??這個(gè)函數(shù)用于去除重復(fù)值姑荷,基本用法為data.drop_duplicates(subset=['A','B'],keep='first',inplace=True),其中subset指明了要去除重復(fù)值的列缩擂,keep指明要保留的列鼠冕。用法比較簡單,看個(gè)例子胯盯。
data_b.drop_duplicates(subset=['A'],keep='first')
-- 輸出
A B C D
0 1.0 1.0 2 2.0
1 2.0 3.0 2 2.0
- drop函數(shù)
??用于刪除數(shù)據(jù)框中的某一行或者某一列懈费,基本用法為drop(labels=None,axis=0, index=None, columns=None, inplace=False)
,默認(rèn)刪除的是行陨闹,如果想刪除列的話楞捂,得指定axis=1。也可以直接指定index或columns確定要?jiǎng)h除的行或列趋厉。
data_b.drop(columns=['A'])
data_b.drop('A',axis=1)
-- 輸出
B C D
0 1.0 2 2.0
1 3.0 2 2.0
2 3.0 1 4.0
3 3.0 2 2.0
- replace函數(shù)
??用于數(shù)據(jù)的替換寨闹,基本用法是replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad'),其中to_replace的字段可以用字典表示君账。
data_b.replace({'A':1,'B':3},10)
-- 輸出
A B C D
0 10.0 1.0 2 2.0
1 2.0 10.0 2 2.0
2 2.0 10.0 1 4.0
3 2.0 10.0 2 2.0
- cut函數(shù)
??cut函數(shù)用來對數(shù)組進(jìn)行切分繁堡,就是把連續(xù)的數(shù)據(jù)劃分為幾個(gè)區(qū)間,基本使用方法是cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')乡数。x是要?jiǎng)澐值膕eries椭蹄,必須是series不能是dataframe。bins可以是整數(shù)也可以是自己定義的區(qū)間净赴。labels這個(gè)參數(shù)用于給你切分完以后生成的數(shù)據(jù)進(jìn)行類別標(biāo)記绳矩。其他參數(shù)可以忽略。這個(gè)的用法只能是pd.cut()玖翅,不能用其他寫法翼馆,如果是指定的分組區(qū)間割以,那么是左不包含,這點(diǎn)需要注意应媚。
0 0
1 1
2 1
3 1
Name: A, dtype: category
Categories (2, int64): [0 < 1]
- get_dummies函數(shù)
??這個(gè)函數(shù)用來實(shí)現(xiàn)onehot編碼顯然適用于數(shù)據(jù)挖掘严沥,使用以后會(huì)進(jìn)行index-column的轉(zhuǎn)換,基本用法是get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)中姜。案例說明一下消玄。
pd.get_dummies(data_b.C)
-- 輸出
1 2
0 0 1
1 0 1
2 1 0
3 0 1
??接下來的函數(shù)是對缺失值進(jìn)行處理。
- isnull函數(shù)和notnull函數(shù)
??這兩個(gè)函數(shù)是對元素級別的操作丢胚,即對每一個(gè)位置判斷是否是空值翩瓜,isnull的功能是如果是空值就返回Ture,否則返回False嗜桌,notnull和isnull的作用相反奥溺。由于是元素級的操作,因此返回的是和原dataframe行列一樣的包含邏輯True和False的dataframe骨宠,用于布爾型的邏輯判斷。因?yàn)樵瓉淼膁ata_b沒有空數(shù)據(jù)相满,做個(gè)shift處理先层亿,shift函數(shù)會(huì)在后邊說,這里先用立美。
data_b.shift()
-- 輸出
A B C D
0 NaN NaN NaN NaN
1 1.0 1.0 2.0 2.0
2 2.0 3.0 2.0 2.0
3 2.0 3.0 1.0 4.0
data_b.shift().isnull()
-- 輸出
A B C D
0 True True True True
1 False False False False
2 False False False False
3 False False False False
data_b.shift().notnull()
-- 輸出
A B C D
0 False False False False
1 True True True True
2 True True True True
3 True True True True
- dropna函數(shù)
??dropna這個(gè)函數(shù)就是移除缺失值匿又,但是針對series和dataframe它的操作邏輯是不一樣的。對于series只是把NA值刪除建蹄,而對于dataframe是把包括NA值的行或列都刪除碌更,默認(rèn)axis=0。更多用法參考請參考官方文檔洞慎。dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)痛单,介紹一個(gè)thresh參數(shù)如果設(shè)置了這個(gè)值,那么只有含大于這個(gè)值的非空行/列才會(huì)保留劲腿,還有subset參數(shù)指定刪除哪一行或者哪一列包含空值的數(shù)據(jù)旭绒。
data_b.shift().A.dropna()
-- 輸出
1 1.0
2 2.0
3 2.0
Name: A, dtype: float64
data_b.shift().dropna()
-- 輸出
A B C D
1 1.0 1.0 2.0 2.0
2 2.0 3.0 2.0 2.0
3 2.0 3.0 1.0 4.0
data_b.shift().dropna(axis=1)
-- 輸出
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
- fillna函數(shù)
??對缺失值進(jìn)行填充處理,fillna(value=None, method=None, axis=0) 焦人,method包括'backfill', 'bfill', 'pad', 'ffill', None這幾個(gè)用法各不相同挥吵。首先fillna只有一個(gè)value,就是全部空值填充花椭。當(dāng)然value也可以用字典填充忽匈,指定特定的列填充不同的值{'A':10,'B':20}。說完這個(gè)接著說method矿辽,pad和ffill類似丹允,都是前項(xiàng)填充郭厌,backfill和bfill都是后項(xiàng)填充,可以用limit限制最多向前尋找?guī)讉€(gè)值嫌松,用axis設(shè)置填充方向沪曙。
data_c.fillna(10)
--輸出
0 1 2
0 1.0 2.0 3.0
1 10.0 10.0 2.0
2 10.0 10.0 10.0
3 8.0 8.0 10.0
data_c.fillna(method = 'bfill')
-- 輸出
0 1 2
0 1.0 2.0 3.0
1 8.0 8.0 2.0
2 8.0 8.0 NaN
3 8.0 8.0 NaN
data_c.fillna(method = 'ffill',limit=2)
-- 輸出
0 1 2
0 1.0 2.0 3.0
1 1.0 2.0 2.0
2 1.0 2.0 2.0
3 8.0 8.0 2.0
2.數(shù)據(jù)處理函數(shù)
??數(shù)據(jù)處理函數(shù)是對數(shù)據(jù)進(jìn)行切片、格式轉(zhuǎn)換萎羔、排序以及對數(shù)據(jù)框進(jìn)行連接等操作液走。
- reshape函數(shù)
??很遺憾這個(gè)函數(shù)python已經(jīng)不支持了,各位看官要用reshape去numpy里的ndarray用吧贾陷。 - stack和unstack函數(shù)
??stack和unstack函數(shù)是對行列索引進(jìn)行轉(zhuǎn)換用的缘眶,stack將columns變?yōu)閕ndex,unstack相反髓废,將index變?yōu)閏olumns巷懈,這個(gè)對于多層索引應(yīng)用效果比較好,其實(shí)是為了聚合統(tǒng)計(jì)方便的慌洪。這兩個(gè)函數(shù)知識(shí)點(diǎn)比較多顶燕,要弄清楚還是去查官方文檔。
data_b.stack()
-- 輸出
0 A 1.0
B 1.0
C 2.0
D 2.0
1 A 2.0
B 3.0
C 2.0
D 2.0
2 A 2.0
B 3.0
C 1.0
D 4.0
3 A 2.0
B 3.0
C 2.0
D 2.0
dtype: float64
data_b.stack().unstack()
-- 輸出
A B C D
0 1.0 1.0 2.0 2.0
1 2.0 3.0 2.0 2.0
2 2.0 3.0 1.0 4.0
3 2.0 3.0 2.0 2.0
- pivot和pivot_table
??這兩個(gè)函數(shù)真的可以讓你像操作excel的數(shù)據(jù)透視表一樣操作dataframe冈爹,pivot函數(shù)功能簡單涌攻,就是做一個(gè)展示,不能進(jìn)行聚合操作频伤,而pivottable可以做聚合操作恳谎。通過例子來感受一下。
data = {'date': ['2018-08-01', '2018-08-02', '2018-08-03', '2018-08-01', '2018-08-03', '2018-08-03',
'2018-08-01', '2018-08-02'],
'variable': ['A','A','A','B','B','C','C','C'],
'value': [3.0 ,4.0 ,6.0 ,2.0 ,8.0 ,4.0 ,10.0 ,1.0 ]}
df = pd.DataFrame(data=data, columns=['date', 'variable', 'value'])
df1 = df.pivot(index='date', columns='variable', values='value')
print(df1)
-- 輸出
variable A B C
date
2018-08-01 3.0 2.0 10.0
2018-08-02 4.0 NaN 1.0
2018-08-03 6.0 8.0 4.0
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
"bar", "bar", "bar", "bar"],
"B": ["one", "one", "one", "two", "two",
"one", "one", "two", "two"],
"C": ["small", "large", "large", "small",
"small", "large", "small", "small",
"large"],
"D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})
print(pd.pivot_table(df, index=['A', 'B'], columns=['C'], values=['D'], aggfunc=[np.mean, np.sum, max]))
-- 輸出
mean sum max
D D D
C large small large small large small
A B
bar one 4.0 5.0 4.0 5.0 4.0 5.0
two 7.0 6.0 7.0 6.0 7.0 6.0
foo one 2.0 1.0 4.0 1.0 2.0 1.0
two NaN 3.0 NaN 6.0 NaN 3.0
- loc和iloc函數(shù)
??操作任何一個(gè)數(shù)據(jù)類型憋肖,切片都是必須要掌握的因痛,通過切片可以取值和進(jìn)行賦值操作。dataframe切片最簡單的是通過columns和index直接取值岸更,有兩種模式比如df['列A']和df.列A鸵膏。但是要取到具體某一列某個(gè)index的數(shù)據(jù),就需要采用loc和iloc函數(shù)了坐慰。loc這個(gè)函數(shù)有兩個(gè)參數(shù)较性,index名和columns名,只能用名字结胀,不能用索引赞咙,columns省略時(shí)默認(rèn)返回所有列,注意取列的時(shí)候用方括號(hào)括起來糟港。loc函數(shù)還有一個(gè)作用就是根據(jù)邏輯值進(jìn)行切片攀操。
data_b.loc[0,['A']]
-- 輸出
A 1.0
Name: 0, dtype: float64
data_b.loc[data_b['A']==1]
-- 輸出
A B C D
0 1.0 1.0 2 2.0
??相比于loc,iloc就比較友好了秸抚,可以用index名和columns名也可以用位置索引速和,混用這種寫法真是太好了歹垫。
data_b.iloc[1,0:3]
-- 輸出
A 2.0
B 3.0
C 2.0
Name: 1, dtype: float64
- ix函數(shù)
- sort_index函數(shù)和sort_values函數(shù)
??這是排序函數(shù),sort_index函數(shù)目前不建議使用了颠放,統(tǒng)一用sort_values函數(shù)排惨。其實(shí)參數(shù)都是差不多的,sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')碰凶,這個(gè)by就是按照哪一列排序暮芭,其他參數(shù)根據(jù)字面意思可以理解。
data_b.sort_values(by='A',ascending=False)
--輸出
A B C D
1 2.0 3.0 2 2.0
2 2.0 3.0 1 4.0
3 2.0 3.0 2 2.0
0 1.0 1.0 2 2.0
- 數(shù)據(jù)格式轉(zhuǎn)換函數(shù)
??因?yàn)橐恍┰蛭覀兛傄M(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換欲低,最常用的就是astype函數(shù)辕宏,這個(gè)是元素級別的操作,要對某一列數(shù)據(jù)進(jìn)行操作砾莱,df.A.astype('int')瑞筐。還有比較常用的是to_numbric函數(shù)和to_datetime函數(shù)。先手to_datetime函數(shù)腊瑟,這個(gè)函數(shù)常用的參數(shù)也就那么兩個(gè)聚假,to_datetime('13000101', format='%Y%m%d', errors='ignore'),第一個(gè)是要轉(zhuǎn)換的字符串闰非,第二個(gè)是要轉(zhuǎn)換的日期格式魔策,其他參數(shù)可以忽略。to_numbric函數(shù)就更簡單了河胎,只要傳給指定的參數(shù),如果符合純數(shù)字特征就轉(zhuǎn)換為數(shù)字虎敦。還有一種方法就是對某一列數(shù)據(jù)使用apply(int)游岳、apply(str)等方法。
??重點(diǎn)說一下日期格式的轉(zhuǎn)換其徙,這個(gè)只能對pandas對象使用胚迫,比如pd.to_datetime([],format=)是對的,如果是pd[列A].to_datetime()用法確實(shí)錯(cuò)的唾那。
??關(guān)于format =''访锻,我給大家提供如下的格式標(biāo)準(zhǔn)。
%d 日期, 01-31
%f 小數(shù)形式的秒闹获,SS.SSS
%H 小時(shí), 00-23
%j 算出某一天是該年的第幾天期犬,001-366
%m 月份,00-12
%M 分鐘, 00-59
%s 從1970年1月1日到現(xiàn)在的秒數(shù)
%S 秒, 00-59
%w 星期, 0-6 (0是星期天)
%W 算出某一天屬于該年的第幾周, 01-53
%Y 年, YYYY
%% 百分號(hào)
start = pd.to_datetime("5-1-2012")#只有pd.to_datetime這一種寫法
-- 輸出
2012-05-01 00:00:00
- merge函數(shù)
??這個(gè)函數(shù)是將兩個(gè)dataframe進(jìn)行合并避诽,需要指明用于合并的列龟虎,即on參數(shù),可以理解為sql的join操作沙庐±鹜祝基本用法為merge(df1,df2, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’))佳吞,要解釋的參數(shù)是how,選擇連接的方式棉安,有outer底扳、inner、left贡耽、right四個(gè)參數(shù)可供選擇衷模,跟sql一樣,不多說了菇爪。left_on和right_on指定左右連接的主鍵算芯,如果兩個(gè)主鍵名字一樣,用on就行了凳宙。left_index和right_index指定用左右的索引作為連接鍵熙揍。suffixes列名重復(fù)了怎么辦,用下劃線區(qū)分氏涩。最后注意一點(diǎn)届囚,一次只能merge兩個(gè)dataframe。
data_a.merge(data_b,left_index=True,right_index=True,how='outer')
-- 輸出
1 2 3 4 A B C D
0 0.0 1.0 2.0 3.0 1.0 1.0 2 2.0
1 4.0 5.0 6.0 7.0 2.0 3.0 2 2.0
2 8.0 9.0 10.0 11.0 2.0 3.0 1 4.0
3 NaN NaN NaN NaN 2.0 3.0 2 2.0
- concat函數(shù)
??數(shù)據(jù)拼接函數(shù)是尖,可以拼接series意系,dataframe等,與merge不同饺汹,concat可以連接很多個(gè)dataframe蛔添,基本用法為pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False),默認(rèn)是按行的方向堆疊兜辞。其他參數(shù)都不是特別重要迎瞧,一般也不用設(shè)置,當(dāng)然有時(shí)候根據(jù)使用場景還是要調(diào)整一下逸吵。這個(gè)要注意objs參數(shù)是dataframe或者series構(gòu)成的列表凶硅。不能寫一個(gè)dataframe,否則會(huì)報(bào)錯(cuò)扫皱。
pd.concat([data_b,data_b])
-- 輸出
A B C D
0 1.0 1.0 2 2.0
1 2.0 3.0 2 2.0
2 2.0 3.0 1 4.0
3 2.0 3.0 2 2.0
0 1.0 1.0 2 2.0
1 2.0 3.0 2 2.0
2 2.0 3.0 1 4.0
3 2.0 3.0 2 2.0
pd.concat([data_a,data_b],axis=1)
-- 輸出
1 2 3 4 A B C D
0 0.0 1.0 2.0 3.0 1.0 1.0 2 2.0
1 4.0 5.0 6.0 7.0 2.0 3.0 2 2.0
2 8.0 9.0 10.0 11.0 2.0 3.0 1 4.0
3 NaN NaN NaN NaN 2.0 3.0 2 2.0
- join函數(shù)
3.數(shù)據(jù)聚合函數(shù)
??數(shù)據(jù)聚合操作是對數(shù)據(jù)進(jìn)行統(tǒng)計(jì)意義上的操作或者自定義函數(shù)進(jìn)行計(jì)算足绅。
- groupby函數(shù)
??為什么把groupby函數(shù)放到第一個(gè)講呢,因?yàn)橛泻芏鄷r(shí)候你做統(tǒng)計(jì)除了針對行列韩脑,更多時(shí)候是要基于分組的氢妈,大部分聚合函數(shù)要在分組的基礎(chǔ)上做。
??groupby有兩種典型用法:
??(1)grouped=df['列a'].groupby([df['列b'],df['列c'])
??(2)grouped=df.groupby(['列b','列c'])['列a']
??這兩種寫法是一樣的意思扰才,用哪個(gè)都可以允懂,但是應(yīng)用的時(shí)候要注意特殊的寫法。 - map和applymap函數(shù)
??map函數(shù)是元素級別的操作衩匣,這個(gè)要注意什么呢蕾总,你不能對著一個(gè)dataframe進(jìn)行map操作粥航,要用map首先得是一個(gè)series,然后是對里邊的元素進(jìn)行操作生百。如果你想對數(shù)據(jù)框進(jìn)行操作怎么辦递雀,有一個(gè)applymap函數(shù),是對數(shù)據(jù)框里的所有元素進(jìn)行操作蚀浆。
lambda x: x*x
data_b.map(lambda x: x*x)
data_b.applymap(lambda x: x*x)
--第一個(gè)輸出報(bào)錯(cuò)
File "/Users/elliot/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 4376, in __getattr__
return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'map'
-- 第二個(gè)輸出
A B C D
0 1.0 1.0 4 4.0
1 4.0 9.0 4 4.0
2 4.0 9.0 1 16.0
3 4.0 9.0 4 4.0
- apply函數(shù)
??apply是pandas里對行缀程、列級元素進(jìn)行操作的函數(shù),也就是計(jì)算時(shí)按行或者列為最小單位進(jìn)行市俊。這個(gè)函數(shù)使用靈活杨凑,因此最常被使用“诿粒基本用法為:apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=args=(), **kwds)撩满,洋洋灑灑寫了這么多參數(shù),其實(shí)能用到的也就是func和axis了绅你,func就是你要應(yīng)用的函數(shù)伺帘,axis決定對行或者對列進(jìn)行操作。
data_b.apply(sum)
-- 輸出
A 7.0
B 10.0
C 7.0
D 10.0
dtype: float64
- agg函數(shù)
??agg函數(shù)和apply函數(shù)其實(shí)是一樣的忌锯,只不過它可以指定不同的列用不同的函數(shù)伪嫁,或者指定所有列用不同的函數(shù),可供選擇的范圍更廣偶垮。
??agg函數(shù)也有兩種寫法:
??(1)df.groupby(['列b']).agg([sum,mean,max])
??(2)df.groupby(['列b']).agg({'列a':sum,'列b':np.mean})
data_b.groupby(['B','C']).agg([sum,np.mean,max])
--輸出
A D
sum mean max sum mean max
B C
1.0 2 1.0 1.0 1.0 2.0 2.0 2.0
3.0 1 2.0 2.0 2.0 4.0 4.0 4.0
2 4.0 2.0 2.0 4.0 2.0 2.0
data_b.groupby(['B']).agg({'A':sum,'B':np.mean})
-- 輸出
A B
B
1.0 1.0 1.0
3.0 6.0 3.0
??以下的所有函數(shù)张咳,除極個(gè)別外都可以配合上面的分組和應(yīng)用函數(shù)使用。
- sum函數(shù)
??求和函數(shù)似舵,沒有什么好說的晶伦。基本用法為sum(a啄枕,axis=0),默認(rèn)是沿著行方向進(jìn)行的加和族沃,也就是對列求和频祝,axis=1表示沿著列方向求和,也就是對行求和脆淹。 - mean函數(shù)
??求均值的函數(shù)常空,注意求均值就是mean,可沒有什么avg函數(shù)盖溺,還有你正常對數(shù)據(jù)框或者series用mean這些都沒問題漓糙,但是要用在apply等函數(shù)里,最好還是加一個(gè)np烘嘱,用np.mean昆禽,目前其他函數(shù)沒發(fā)現(xiàn)這個(gè)問題蝗蛙,大家用的時(shí)候注意吧。 - count函數(shù)和value_counts函數(shù)
??計(jì)數(shù)函數(shù)醉鳖,對dataframe里的數(shù)據(jù)進(jìn)行非NA值的統(tǒng)計(jì)捡硅。這個(gè)是對所有元素進(jìn)行的無差別操作,就是有一個(gè)非NA值就加1盗棵。但是有的時(shí)候我們需要對于某一列中有哪些不同元素進(jìn)行計(jì)數(shù)統(tǒng)計(jì)壮韭,這個(gè)時(shí)候就要用value_counts函數(shù),由于這是元素級別的操作纹因,所以這個(gè)只能對dataframe的某一列就是series使用喷屋。
data_b.count()
data_b['A'].value_counts()
--輸出
A 4
B 4
C 4
D 4
2.0 3
1.0 1
- unique函數(shù)
??unique函數(shù)返回的是某一列的不重復(fù)值,是對列進(jìn)行的操作瞭恰,常用的方法是df.列A.unique()屯曹,這個(gè)不啰嗦了阁谆,只注意一點(diǎn)占卧,unique返回值是數(shù)組。 - min和max函數(shù)
??這個(gè)真的沒啥好說的礁击,求最大最小值陕截。 - median函數(shù)
??返回中位數(shù)驳棱。 - std和var函數(shù)
??返回標(biāo)準(zhǔn)差和方法,計(jì)算方法是除以樣本數(shù)-1(n-1)农曲。 - mode函數(shù)
??這個(gè)函數(shù)的作用是沿著某個(gè)軸返回一組眾數(shù)社搅,為什么說是一組呢,因?yàn)橛锌赡鼙姅?shù)不止一個(gè)乳规⌒卧幔基本用法為:mode(axis=0, numeric_only=False),也就是說不僅可以對數(shù)字操作還可以對字符類型進(jìn)行操作暮的,默認(rèn)是沿著行方向返回眾數(shù)笙以。這個(gè)需要案例說明,可以看出返回的是一個(gè)dataframe冻辩,因?yàn)楸姅?shù)不止一個(gè)會(huì)按順序輸出猖腕,行數(shù)跟眾數(shù)最多的那一列的眾數(shù)個(gè)數(shù)相同,缺失值以NaN填充恨闪。但是眾數(shù)我們只需要一個(gè)倘感,這個(gè)時(shí)候用iloc切片操作,即data_b.mode().iloc[0,:]咙咽。
data_b = pd.DataFrame({'A':[1,2,3,4],'B':[1,3,3,4],'C':[2,2,1,2]})
data_b.mode()
data_b.mode(axis = 1)
--輸出1
A B C
0 1 3.0 2.0
1 2 NaN NaN
2 3 NaN NaN
3 4 NaN NaN
--輸出2
0
0 1
1 2
2 3
3 4
- corr函數(shù)
??這個(gè)函數(shù)返回的是各列的相關(guān)系數(shù)老玛,[-1,1]之間,1代表嚴(yán)格正相關(guān),-1代表嚴(yán)格負(fù)相關(guān)蜡豹◆锪福基本用法為:corr(method='pearson', min_periods=1),其中method可選{‘pearson’, ‘kendall’, ‘spearman’}余素,默認(rèn)用pearson豹休,min_periods樣本最少的數(shù)據(jù)量,默認(rèn)是1桨吊。舉個(gè)栗子感受一下威根。
data_b.corr()
--輸出
A B C D
A 1.000000 1.000000 -0.333333 0.333333
B 1.000000 1.000000 -0.333333 0.333333
C -0.333333 -0.333333 1.000000 -1.000000
D 0.333333 0.333333 -1.000000 1.000000
- argmax函數(shù)和argmin函數(shù)(idxmax和idxmin)
??這兩個(gè)函數(shù)也是元素級別操作的函數(shù),因此也可以再series中使用而不可以再dataframe中使用视乐。未來argmax函數(shù)和argmin函數(shù)就不支持了洛搀,以后直接用idxmax和idxmin函數(shù)。
data_b['A'].idxmax()
--輸出
1
- cumsum函數(shù)和cumprod函數(shù)
??這個(gè)是對行列操作的函數(shù)佑淀,返回的是與原dataframe大小完全一樣的dataframe留美,不過是對結(jié)果進(jìn)行累加和累乘操作了。
data_b.cumsum()
data_b.cumprod()
-- 輸出
A B C D
0 1.0 1.0 2.0 2.0
1 3.0 4.0 4.0 4.0
2 5.0 7.0 5.0 8.0
3 7.0 10.0 7.0 10.0
A B C D
0 1.0 1.0 2.0 2.0
1 2.0 3.0 4.0 4.0
2 4.0 9.0 4.0 16.0
3 8.0 27.0 8.0 32.0
- cummin函數(shù)和cummax函數(shù)
??累計(jì)最大和最小值伸刃,工作中其實(shí)沒遇到谎砾,但是這個(gè)顯然是有用的,同樣作用于dataframe捧颅,返回的是每一行/列景图,截止到當(dāng)前元素的最大值和最小值。
data_b.cummin()
data_b.cummax()
--輸出
A B C D
0 1.0 1.0 2.0 2.0
1 1.0 1.0 2.0 2.0
2 1.0 1.0 1.0 2.0
3 1.0 1.0 1.0 2.0
A B C D
0 1.0 1.0 2.0 2.0
1 2.0 3.0 2.0 2.0
2 2.0 3.0 2.0 4.0
3 2.0 3.0 2.0 4.0
- pct_change函數(shù)
??這個(gè)函數(shù)碉哑,特別適合時(shí)間序列相關(guān)的操作挚币,算的是前后數(shù)據(jù)的差距百分比,就是后數(shù)減前數(shù)除以前數(shù)扣典。返回的也是和原dataframe行列數(shù)一樣的dataframe妆毕。
data_b.pct_change()
-- 輸出
A B C D
0 NaN NaN NaN NaN
1 1.0 2.0 0.0 0.0
2 0.0 0.0 -0.5 1.0
3 0.0 0.0 1.0 -0.5
- diff函數(shù)
??這個(gè)函數(shù)和上面那個(gè)pct_change函數(shù)一樣也是用于時(shí)間序列的操作,就是向前或者向后截取數(shù)據(jù)贮尖,截取不到的取空笛粘,返回的是和原dataframe行列數(shù)一樣的dataframe∈酰基本用法為diff(periods=1, axis=0)闰蛔,axis我就不解釋了,這個(gè)periods就是移動(dòng)的步數(shù)图柏,可取正或者負(fù),正就是往下走一步任连,負(fù)就是往上走一步蚤吹。
data_b.diff(-1)
data_b.diff(1)
--輸出1
A B C D
0 -1.0 -2.0 0.0 0.0
1 0.0 0.0 1.0 -2.0
2 0.0 0.0 -1.0 2.0
3 NaN NaN NaN NaN
--輸出2
0 NaN NaN NaN NaN
1 1.0 2.0 0.0 0.0
2 0.0 0.0 -1.0 2.0
3 0.0 0.0 1.0 -2.0
- shift函數(shù)
??如果不理解上面兩個(gè)函數(shù)的操作,那么來講一下shift操作,其實(shí)就是數(shù)據(jù)的移動(dòng)裁着,是上面兩個(gè)函數(shù)計(jì)算的中間步驟繁涂。基本用法為shift(periods=1, freq=None, axis=0)二驰,這個(gè)和diff函數(shù)一樣一樣的扔罪,這個(gè)freq我稍微解釋一下就是按什么技術(shù),默認(rèn)就是int桶雀,還有datetime的例子矿酵,因?yàn)檫@個(gè)一般用于時(shí)間序列的處理。
data_b.shift()
-- 輸出
A B C D
0 NaN NaN NaN NaN
1 1.0 1.0 2.0 2.0
2 2.0 3.0 2.0 2.0
3 2.0 3.0 1.0 4.0
4.數(shù)據(jù)高階操作
??這部分是筆者在進(jìn)行一次聚類分析判斷nickname是否是全為英文或者漢字字符時(shí)發(fā)現(xiàn)的矗积,非常好用全肮。
.dt
.str
isalpha ( ) 判斷是否全是字母
isdigit ( ) 判斷是否全是數(shù)字
isalnum ( ) 是否全是數(shù)字或字母
isupper ( ) ... 大寫字母
islower ( ) ... 小寫字母
istitle ( ) ... 首字母大寫
isspace() ... 空白字符
5.數(shù)據(jù)保存和轉(zhuǎn)換函數(shù)
- to_csv函數(shù)
??這個(gè)函數(shù)是dataframe的函數(shù),作用是將你計(jì)算得到的dataframe轉(zhuǎn)回到excel中以方便下一步的操作棘捣。官方給的參數(shù)特別多辜腺,to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression='infer', quoting=None, quotechar='"', line_terminator=None, chunksize=None, tupleize_cols=None, date_format=None, doublequote=True, escapechar=None, decimal='.')。其實(shí)重要的就是指定路徑和文件名乍恐,指定是否要第一行评疗,是否要索引和列名,指定分隔符茵烈,其他都不是特別重要百匆。這個(gè)函數(shù)我就不寫例子了。