介紹
在Python中,pandas是基于NumPy數(shù)組構(gòu)建的掸鹅,使數(shù)據(jù)預(yù)處理塞帐、清洗、分析工作變得更快更簡單巍沙。pandas是專門為處理表格和混雜數(shù)據(jù)設(shè)計(jì)的葵姥,而NumPy更適合處理統(tǒng)一的數(shù)值數(shù)組數(shù)據(jù)。
使用下面格式約定句携,引入pandas包:
import pandas as pd
pandas有兩個(gè)主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame榔幸。
Series
Series是一種類似于一維數(shù)組的對象,它由一組數(shù)據(jù)(各種NumPy數(shù)據(jù)類型)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成,即index和values兩部分削咆,可以通過索引的方式選取Series中的單個(gè)或一組值牍疏。
Series的創(chuàng)建
pd.Series(list,index=[ ]),第二個(gè)參數(shù)是Series中數(shù)據(jù)的索引拨齐,可以省略鳞陨。
- 第一個(gè)參數(shù)可以是列表\ndarray
import numpy as np, pandas as pd
arr1 = np.arange(10)
s1 = pd.Series(arr1)
print(s1) #由于我們沒有為數(shù)據(jù)指定索引,于是會自動創(chuàng)建一個(gè)0到N-1(N為數(shù)據(jù)的長度)的整數(shù)型索引
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
- 第一個(gè)參數(shù)可以是字典奏黑,字典的鍵將作為Series的索引
- 第一個(gè)參數(shù)可以是DataFrame中的某一行或某一列
Series類型的操作
Series類型索引炊邦、切片、運(yùn)算的操作類似于ndarray熟史,同樣的類似Python字典類型的操作馁害,包括保留字in操作、使用.get()方法蹂匹。
Series和ndarray之間的主要區(qū)別在于Series之間的操作會根據(jù)索引自動對齊數(shù)據(jù)碘菜。
DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)類型,每列值類型可以不同限寞,是最常用的pandas對象忍啸。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個(gè)索引)履植。DataFrame中的數(shù)據(jù)是以一個(gè)或多個(gè)二維塊存放的(而不是列表计雌、字典或別的一維數(shù)據(jù)結(jié)構(gòu))。
DataFrame的創(chuàng)建
pd.DataFrame(data,columns = [ ],index = [ ]):columns和index為指定的列玫霎、行索引凿滤,并按照順序排列。
- 創(chuàng)建DataFrame最常用的是直接傳入一個(gè)由等長列表或NumPy數(shù)組組成的字典庶近,會自動加上行索引翁脆,字典的鍵會被當(dāng)做列索引:
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
df= pd.DataFrame(data)
In [45]: df
Out[45]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
5 3.2 Nevada 2003
如果創(chuàng)建時(shí)指定了columns和index索引,則按照索引順序排列鼻种,并且如果傳入的列在數(shù)據(jù)中找不到反番,就會在結(jié)果中產(chǎn)生缺失值:
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])
In [49]: df2
Out[49]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
six 2003 Nevada 3.2 NaN
- 另一種常見的創(chuàng)建DataFrame方式是使用嵌套字典,如果嵌套字典傳給DataFrame叉钥,pandas就會被解釋為外層字典的鍵作為列罢缸,內(nèi)層字典鍵則作為行索引:
In [65]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
....: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [66]: df3 = pd.DataFrame(pop)
In [67]: df3
Out[67]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
DataFrame對象操作
- df.values:將DataFrame轉(zhuǎn)換為ndarray二維數(shù)組,注意后面不加()投队。
- 通過類似字典標(biāo)記的方式或?qū)傩缘姆绞椒憬梢詫ataFrame的列獲取為一個(gè)Series。
- 列可以通過賦值的方式進(jìn)行修改蛾洛。例如,我們可以給那個(gè)空的"debt"列賦上一個(gè)標(biāo)量值或一組值。
- 將列表或數(shù)組賦值給某個(gè)列時(shí)轧膘,其長度必須跟DataFrame的長度相匹配钞螟。如果賦值的是一個(gè)Series,就會精確匹配DataFrame的索引谎碍,所有的空位都將被填上缺失值鳞滨。
- 為不存在的列賦值會創(chuàng)建出一個(gè)新列。關(guān)鍵字del用于刪除列蟆淀。
import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
In [48]: df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
....: index=['one', 'two', 'three', 'four', 'five', 'six'])
In [50]: df2.columns
Out[50]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
#通過類似字典標(biāo)記的方式或?qū)傩缘姆绞秸玻梢詫ataFrame的列獲取為一個(gè)Series。
In [51]: df2['state'] #或者df2.state
Out[51]:
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
six Nevada
Name: state, dtype: object
#列可以通過賦值的方式進(jìn)行修改熔任。例如褒链,我們可以給那個(gè)空的"debt"列賦上一個(gè)標(biāo)量值或一組值
In [54]: frame2['debt'] = 16.5
In [55]: frame2
Out[55]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
six 2003 Nevada 3.2 16.5
#將列表或數(shù)組賦值給某個(gè)列時(shí),其長度必須跟DataFrame的長度相匹配疑苔。如果賦值的是一個(gè)Series甫匹,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值
In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
In [59]: df2['debt'] = val
In [60]: df2
Out[60]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
six 2003 Nevada 3.2 16.5
#為不存在的列賦值惦费,會創(chuàng)建出一個(gè)新列
In [61]: df2['eastern'] = df2.state == 'Ohio'
In [62]: df2
Out[62]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
six 2003 Nevada 3.2 NaN False
#關(guān)鍵字del用于刪除列
In [63]: del df2['eastern']
In [64]: df2.columns
Out[64]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
pandas的基本功能
數(shù)據(jù)索引:Series和DataFrame的索引是Index類型兵迅,Index對象是不可修改,可通過索引值或索引標(biāo)簽獲取目標(biāo)數(shù)據(jù)薪贫,也可通過索引使序列或數(shù)據(jù)框的計(jì)算恍箭、操作實(shí)現(xiàn)自動化對齊。索引類型index的常用方法:
- .append(idx):連接另一個(gè)Index對象瞧省,產(chǎn)生新的Index對象
- .diff(idx):計(jì)算差集扯夭,產(chǎn)生新的Index對象
- .intersection(idx):計(jì)算交集
- .union(idx):計(jì)算并集
- .delete(loc):刪除loc位置處的元素
-
.insert(loc,e):在loc位置增加一個(gè)元素
重新索引:能夠改變、重排Series和DataFrame索引臀突,會創(chuàng)建一個(gè)新對象勉抓,如果某個(gè)索引值當(dāng)前不存在,就引入缺失值候学。
df.reindex(index, columns ,fill_value, method, limit, copy ):index/columns為新的行列自定義索引藕筋;fill_value為用于填充缺失位置的值;method為填充方法梳码,ffill當(dāng)前值向前填充隐圾,bfill向后填充;limit為最大填充量掰茶;copy 默認(rèn)True暇藏,生成新的對象,F(xiàn)alse時(shí)濒蒋,新舊相等不復(fù)制盐碱。
In [98]: frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
....: index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])
In [99]: frame
Out[99]:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
In [100]: frame2 = frame.reindex(['a', 'b', 'c', 'd'])
In [101]: frame2
Out[101]:
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
刪除指定索引:默認(rèn)返回的是一個(gè)新對象把兔。
.drop():能夠刪除Series和DataFrame指定行或列索引。
刪除一行或者一列時(shí)瓮顽,用單引號指定索引县好,刪除多行時(shí)用列表指定索引。
如果刪除的是列索引暖混,需要增加axis=1或axis='columns'作為參數(shù)缕贡。
增加inplace=True作為參數(shù),可以就地修改對象拣播,不會返回新的對象晾咪。
索引、選取和過濾
df.loc[行標(biāo)簽贮配,列標(biāo)簽]:通過標(biāo)簽查詢指定的數(shù)據(jù)谍倦,第一個(gè)值為行標(biāo)簽,第二值為列標(biāo)簽牧嫉。當(dāng)?shù)诙€(gè)參數(shù)為空時(shí)剂跟,查詢的是單個(gè)或多個(gè)行的所有列。如果查詢多個(gè)行酣藻、列的話曹洽,則兩個(gè)參數(shù)用列表表示。
df.iloc[行位置辽剧,列位置]:通過默認(rèn)生成的數(shù)字索引查詢指定的數(shù)據(jù)送淆。
In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)),
.....: index=['Ohio', 'Colorado', 'Utah', 'New York'],
.....: columns=['one', 'two', 'three', 'four'])
?
In [129]: data
Out[129]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
#df.loc選取第二行、第二三列
In [137]: data.loc['Colorado', ['two', 'three']]
Out[137]:
two 5
three 6
Name: Colorado, dtype: int64
#df.iloc選取第二行怕轿、第二三列
In [138]: data.iloc[1, [1, 2]]
Out[138]:
two 5
three 6
Name: Colorado, dtype: int64
在pandas中偷崩,有多個(gè)方法可以選取和重新組合數(shù)據(jù)。對于DataFrame撞羽,表5-4進(jìn)行了總結(jié)
排序 :在排序時(shí)呜象,任何缺失值默認(rèn)都會被放到末尾
.sort_index(axis=0, ascending=True):根據(jù)指定軸索引的值進(jìn)行排序膳凝。默認(rèn)軸axis=0, ascending=True,即默認(rèn)根據(jù)0軸的索引值做升序排序恭陡。軸axis=1為根據(jù)1軸的索引值排序鸠项, ascending=False為降序。
在指定軸上根據(jù)數(shù)值進(jìn)行排序子姜,默認(rèn)升序。
Series.sort_values(axis=0, ascending=True):只能根據(jù)0軸的值排序楼入。
DataFrame.sort_values(by, axis=0, ascending=True)哥捕,參數(shù)by為axis軸上的某個(gè)索引或索引列表。
pandas數(shù)據(jù)分析
統(tǒng)計(jì)分析嘉熊、相關(guān)分析
適用于Series和DataFrame的基本統(tǒng)計(jì)分析函數(shù):傳入axis='columns'或axis=1將會按行進(jìn)行運(yùn)算遥赚。
.describe():針對各列的多個(gè)統(tǒng)計(jì)匯總,用統(tǒng)計(jì)學(xué)指標(biāo)快速描述數(shù)據(jù)的概要阐肤。
.sum():計(jì)算各列數(shù)據(jù)的和
.count():非NaN值的數(shù)量
.mean( )/.median():計(jì)算數(shù)據(jù)的算術(shù)平均值凫佛、算術(shù)中位數(shù)
.var()/.std():計(jì)算數(shù)據(jù)的方差、標(biāo)準(zhǔn)差
.corr()/.cov():計(jì)算相關(guān)系數(shù)矩陣孕惜、協(xié)方差矩陣愧薛,是通過參數(shù)對計(jì)算出來的。Series的corr方法用于計(jì)算兩個(gè)Series中重疊的衫画、非NA的毫炉、按索引對齊的值的相關(guān)系數(shù)。DataFrame的corr和cov方法將以DataFrame的形式分別返回完整的相關(guān)系數(shù)或協(xié)方差矩陣削罩。
.corrwith():利用DataFrame的corrwith方法瞄勾,可以計(jì)算其列或行跟另一個(gè)Series或DataFrame之間的相關(guān)系數(shù)。傳入一個(gè)Series將會返回一個(gè)相關(guān)系數(shù)值Series(針對各列進(jìn)行計(jì)算)弥激,傳入一個(gè)DataFrame則會計(jì)算按列名配對的相關(guān)系數(shù)进陡。
.min()/.max():計(jì)算數(shù)據(jù)的最小值、最大值
.diff():計(jì)算一階差分微服,對時(shí)間序列很有效
.mode():計(jì)算眾數(shù)趾疚,返回頻數(shù)最高的那(幾)個(gè)
.mean():計(jì)算均值
.quantile():計(jì)算分位數(shù)(0到1)
.isin():用于判斷矢量化集合的成員資格,可用于過濾Series中或DataFrame列中數(shù)據(jù)的子集
適用于Series的基本統(tǒng)計(jì)分析函數(shù)职辨,DataFrame[列名]返回的是一個(gè)Series類型盗蟆。
.unique():返回一個(gè)Series中的唯一值組成的數(shù)組。
.value_counts():計(jì)算一個(gè)Series中各值出現(xiàn)的頻率舒裤。
.argmin()/.argmax():計(jì)算數(shù)據(jù)最大值喳资、最小值所在位置的索引位置(自動索引)
.idxmin()/.idxmax():計(jì)算數(shù)據(jù)最大值、最小值所在位置的索引(自定義索引)
分組
- DataFrame.groupby():分組函數(shù)腾供,使用方法參考https://blog.csdn.net/cymy001/article/details/78300900
-
pandas.cut():根據(jù)數(shù)據(jù)分析對象的特征仆邓,按照一定的數(shù)值指標(biāo)鲜滩,把數(shù)據(jù)分析對象劃分為不同的區(qū)間部分來進(jìn)行研究,以揭示其內(nèi)在的聯(lián)系和規(guī)律性节值。類似給成績設(shè)定優(yōu)良中差戏仓,比如:0-59分為差,60-70分為中闹司,71-80分為優(yōu)秀等等剥懒。使用方法參考
https://blog.csdn.net/weixin_39541558/article/details/80578529
https://blog.csdn.net/missyougoon/article/details/83986511
pandas讀寫文本格式的數(shù)據(jù)
pandas提供了一些用于將表格型數(shù)據(jù)讀取為DataFrame對象的函數(shù)。下表對它們進(jìn)行了總結(jié)匿乃,其中read_csv()桩皿、read_table()、to_csv()是用得最多的幢炸。
用pandas來進(jìn)行數(shù)據(jù)清洗和準(zhǔn)備
在數(shù)據(jù)分析和建模的過程中宛徊,相當(dāng)多的時(shí)間要用在數(shù)據(jù)準(zhǔn)備上:加載佛嬉、清理、轉(zhuǎn)換以及重塑闸天。
處理缺失數(shù)據(jù)
在許多數(shù)據(jù)分析工作中暖呕,缺失數(shù)據(jù)是經(jīng)常發(fā)生的。對于數(shù)值數(shù)據(jù)苞氮,pandas使用浮點(diǎn)值NaN(np.nan)表示缺失數(shù)據(jù)缰揪,也可將缺失值表示為NA(Python內(nèi)置的None值)。
- .info():查看數(shù)據(jù)的信息葱淳,包括每個(gè)字段的名稱钝腺、非空數(shù)量、字段的數(shù)據(jù)類型赞厕。
- .isnull():返回一個(gè)同樣長度的值為布爾型的對象(Series或DataFrame)艳狐,表示哪些值是缺失的,.notnull()為其否定形式皿桑。
import pandas as pd
import numpy as np
In [10]: string_data = pd.Series(['aardvark', 'artichoke', np.nan, None])
In [11]: string_data
Out[11]:
0 aardvark
1 artichoke
2 NaN
3 None
dtype: object
In [14]: string_data.isnull()
Out[14]:
0 False
1 False
2 True
3 True
dtype: bool
- .dropna():刪除缺失數(shù)據(jù)毫目。對于Series對象,dropna返回一個(gè)僅含非空數(shù)據(jù)和索引值的Series诲侮。對于DataFrame對象镀虐,dropna默認(rèn)刪除含有缺失值的行;如果想刪除含有缺失值的列沟绪,需傳入axis = 1作為參數(shù)刮便;如果想刪除全部為缺失值的行或者列,需傳入how='all'作為參數(shù)绽慈;如果想留下一部分缺失數(shù)據(jù)恨旱,需傳入thresh = n作為參數(shù)辈毯,表示每行至少n個(gè)非NA值。
import pandas as pd
import numpy as np
In [19]: data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
In [20]: data.dropna()
Out[22]:
0 1 2
0 1.0 6.5 3.0
#傳入how='all'將只丟棄全為NA的那些行:
In [23]: data.dropna(how='all')
Out[23]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
In [24]: data[4] = NA
In [25]: data
Out[25]:
0 1 2 4
0 1.0 6.5 3.0 NaN
1 1.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 6.5 3.0 NaN
#用這種方式丟棄列搜贤,只需傳入axis=1即可:
In [26]: data.dropna(axis=1, how='all')
Out[26]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
#假設(shè)你只想留下一部分觀測數(shù)據(jù)谆沃,可以用thresh參數(shù)實(shí)現(xiàn)此目的:
In [27]: df = pd.DataFrame(np.random.randn(7, 3))
In [28]: df.iloc[:4, 1] = NA
In [29]: df.iloc[:2, 2] = NA
In [30]: df
Out[30]:
0 1 2
0 -0.204708 NaN NaN
1 -0.555730 NaN NaN
2 0.092908 NaN 0.769023
3 1.246435 NaN -1.296221
4 0.274992 0.228913 1.352917
5 0.886429 -2.001637 -0.371843
6 1.669025 -0.438570 -0.539741
In [32]: df.dropna(thresh=2)
Out[32]:
0 1 2
2 0.092908 NaN 0.769023
3 1.246435 NaN -1.296221
4 0.274992 0.228913 1.352917
5 0.886429 -2.001637 -0.371843
6 1.669025 -0.438570 -0.539741
- .fillna(value,method,limit,inplace):填充缺失值。value為用于填充的值(比如0仪芒、'a'等)或者是字典(比如{'列':1,'列':8,……}為指定列的缺失數(shù)據(jù)填充值)唁影;method默認(rèn)值為ffill,向前填充掂名,bfill為向后填充夭咬;limit為向前或者向后填充的最大填充量。inplace默認(rèn)會返回新對象铆隘,修改為inplace=True可以對現(xiàn)有對象進(jìn)行就地修改。
數(shù)據(jù)轉(zhuǎn)換
替換值
.replace(old, new):用新的數(shù)據(jù)替換老的數(shù)據(jù)南用,如果希望一次性替換多個(gè)值膀钠,old和new可以是列表。默認(rèn)會返回一個(gè)新的對象裹虫,傳入inplace=True可以對現(xiàn)有對象進(jìn)行就地修改肿嘲。
刪除重復(fù)數(shù)據(jù)
- .duplicated():判斷各行是否是重復(fù)行(前面出現(xiàn)過的行),返回一個(gè)布爾型Series筑公。
- .drop_duplicates():刪除重復(fù)行雳窟,返回刪除后的DataFrame對象。默認(rèn)保留的是第一個(gè)出現(xiàn)的行匣屡,傳入keep='last'作為參數(shù)后封救,則保留最后一個(gè)出現(xiàn)的行。
- 兩者都默認(rèn)會對全部列做判斷捣作,在傳入列索引組成的列表[ '列1' , '列2' , ……]作為參數(shù)后誉结,可以只對這些列進(jìn)行重復(fù)項(xiàng)判斷。
利用函數(shù)或字典進(jìn)行數(shù)據(jù)轉(zhuǎn)換
- Series.map():接受一個(gè)函數(shù)或字典作為參數(shù)券躁。使用map方法是一種實(shí)現(xiàn)元素級轉(zhuǎn)換以及其他數(shù)據(jù)清理工作的便捷方式惩坑。
import pandas as pd
In [52]: data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon','pastrami', 'corned beef', 'bacon','pastrami', 'honey ham', 'nova lox'],
.... 'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
meat_to_animal = {
'bacon': 'pig', 'pulled pork': 'pig', 'pastrami': 'cow', 'corned beef': 'cow',
'honey ham': 'pig', 'nova lox': 'salmon'
}
#增加一列animal
In [57]: data['animal'] = data['food'].map(meat_to_animal)
In [58]: data
Out[58]:
food ounces animal
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
DataFrame常見函數(shù)
df.head():查詢數(shù)據(jù)的前五行
df.tail():查詢數(shù)據(jù)的末尾5行
pandas.cut()
pandas.qcut() 基于分位數(shù)的離散化函數(shù)∫舶荩基于秩或基于樣本分位數(shù)將變量離散化為等大小桶以舒。
pandas.date_range() 返回一個(gè)時(shí)間索引
df.apply() 沿相應(yīng)軸應(yīng)用函數(shù)
Series.value_counts() 返回不同數(shù)據(jù)的計(jì)數(shù)值
df.aggregate()
df.reset_index() 重新設(shè)置index,參數(shù)drop = True時(shí)會丟棄原來的索引慢哈,設(shè)置新的從0開始的索引蔓钟。常與groupby()一起用
numpy.zeros()